- CLI(Command line User Interface):命令行用户接口。是常见的Dos命令行操作。需要记忆一些常用的命令,操作不直观。
- GUI(Graphical User InterFace):图形用户接口。用图形的方式,来显示计算机操作的界面,方便直观。
- Java为GUI提供的对象都存在在java.Awt和javax.Swing两个包中。
- java.Awt(Abstract Window ToolKit):抽象窗口工具包。需要调用本地系统方法实现功能。属重量级件。
- javax.Swing:在Awt的基础上建立的一套图形界面系统,其中提供了更多的组件,且完全由Java实现,增强了移植性,属轻量级件。
二、继承关系图
- Container:为容器,是一个特殊的组件,该组件中可以通过add方法添加其他组件进来。
- Container常用子类:Window Panel(面板,不能单独存在。)
- Window常用子类:Frame Dialog
三、布局管理器
- 容器中的组件的排放方式,就是布局。常见的布局管理器:
- FlowLayout:流式布局管理器。从左到右的顺序排列。Panel默认的布局管理器。
- BorderLayout:边界布局管理器。 东,西,南,北,中。Frame默认的布局管理器。
- GridLayout:网络布局管理器。规则的矩阵。
- CardLayout:卡片布局管理器。选项卡。
- GridBagLayout:网络包布局管理器。 非规则的矩阵。
四、简单窗体创建过程
- 创建Frame窗体。
- Frame f = new Frame("my awt");
- 对窗体进行基本设置。
- 比如:大小,位置,布局。 Frame创建后默认的布局是边界式布局, 在没有设置边界坐标时,为居中填充。
- 对窗体大小设置: 500横向坐标,400纵向坐标。
- f.setSize(500,400);
- 设置窗体出现位置:300顶点距左边距离,200顶点距上边距离。
- f.setLocation(300,200);
- 设置布局管理,流式布局。
- f.setLayout(new FlowLayout());
- 比如:大小,位置,布局。 Frame创建后默认的布局是边界式布局, 在没有设置边界坐标时,为居中填充。
- 定义组件。
- Button b = new Button("按钮");
- 将组件通过窗体的add方法添加到窗体中。
- 添加按钮: f.add(b);
- 让窗体显示,通过setVisible(true)。
- f.setVisible(true);
五、事件监听机制组成
- 事件源(组件)
- 就是Awt包或者Swing包中的那些图形界面组件。
- 事件(Event)
- 每一个事件源都有自己特有的对应事件和共性事件。
- 监听器(Listener)
- 将可以出发某一个事件的动作(不只一个动作)都已经封装到了监听器中。
- 事件处理(引发事件后处理方式)。
- 我们要做的事情是:对产生的动作进行处理。
- 注:前三者,在Java中都已经定义好了。直接获取其对象来用就可以了。,
六、适配器:Adapter
- 适配器出现的原因是:方便创建监听器对象。
- 因为: 监听器里有多个方法,而我们只需要用其中的一个或几个。覆盖全部方法比较麻烦,所以监听器给我们提供了一个已有的子类 ,
- 将监听器的所有方法都覆盖完,我们只要继承这个子类,也就是适配器,使用我们所需要的方法即可。
七、事件监听机制流程图
八、事件监听机制流程
- 确定事件源 :窗体或组件。
- 如:窗体作为事件源
- Frame frame = new Frame(“myFrame”);
- 通过事件源对象的addXXXListener()方法将侦听器注册到该事件源上。
- 如:添加窗口监听器
- frame. addWindowListener(WindowListener l);
- 该方法中接收XXXListener的子类对象,或者XXXListener的子类XXXAdapter的子类对象。一般用匿名内部类实现。 在覆盖方法的时候,方法的参数一般是XXXEvent类型的变量接收。
- 如:
frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { //退出程序 System.exit(0); } }
- 如:
- 事件触发后会把事件打包成对象传递给该变量。(其中包括事件源对象。通过getSource()或者,getComponent()获取。)
- 如:关闭frame窗体事件触发,
- 关闭窗体动作触发到frame上,产生事件对象new WindowAdapter()
- 通过frame将new WindowAdapter()传递给监听器的windowClosing(WindowEvent e) 方法
- 执行windowClosing(WindowEvent e) 方法。
九、添加监听器
想要知道哪个组件具备什么样的特有监听器,需要查看该组件对象的功能。
示例:
import java.awt.*;
import java.awt.event.*;
class MouseAndKeyEvent
{
//定义该图形中所需要的组件的引用。
private Frame f;
//添加按钮 在此建立引用,事件可以作用于整个类。
private Button but;
//添加文本框
private TextField tf;
MouseAndKeyEvent()
{
init();
}
//图形化界面初始化
public void init()
{
f = new Frame("my frame");
//对frame进行基本设置
f.setBounds(300,100,600,500);
f.setLayout(new FlowLayout());
tf = new TextField(20);
but = new Button("my button");
//将组件条件到frame中
f.add(tf);
f.add(but);
//加载一下窗体上事件
myEvent();
//显示窗体
f.setVisible(true);
//不在此写事件,要不事件和图形化界面分离开。
}
private void myEvent()
{
f.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
but.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
System.out.println("action OK");
}
});
//给Button添加鼠标监听
but.addMouseListener(new MouseAdapter()
{
int count = 1;
int ClickCount = 1;
public void mouseEntered(MouseEvent e)
{
System.out.println("鼠标进入组件" + count++);
}
public void mouseClicked(MouseEvent e)
{
if(e.getClickCount()==2)
System.out.println("鼠标双击动作");
//System.out.println("单击动作"+ClickCount++);
}
});
//给Button添加键盘监听
but.addKeyListener(new KeyAdapter()
{
public void keyPressed(KeyEvent e)
{
int code = e.getKeyCode();
if(e.isControlDown()&& code==KeyEvent.VK_ENTER)
System.out.println("ctrl+enter is run");
if(code == KeyEvent.VK_ESCAPE)
System.exit(0);
}
});
//
tf.addKeyListener(new KeyAdapter()
{
public void keyPressed(KeyEvent e)
{
int code = e.getKeyCode();
if(!(code>=KeyEvent.VK_0 && code<=KeyEvent.VK_9))
{
System.out.println(code+"...是非法的");
e.consume();
}
}
});
}
public static void main(String[] args)
{
new MouseAndKeyEvent();
}
}
十、菜单(Menu)
1.菜单继承体系图:
2.使用说明:
- Menu:菜单,继承MenuItem;有右三角的图标存在,可添加Menu和MenuItem
- MenuBar:菜单栏,可添加菜单和菜单条目。一般先创建菜单栏,再创建菜单。
- MenuItem:菜单条目,也称菜单项,是最终的菜单项。
- 菜单的事件处理和组件一样,可以对类型为MenuItem和Menu的对象这个事件源添加活动监听ActionListener,并进行相关的事件处理。
- 通过setMenuBar()方法,将菜单添加到Frame中。
十一、FileDialog类
作用:显示一个对话框窗口,用户可以从中选择文件。FileDialog(Frame parent, String title, int mode)
:mode
:对话框的模式,可以是FileDialog.LOAD
或FileDialog.SAVE
FileDialog.LOAD,打开。FileDialog.SAVE,保存。
示例:
import java.awt.*;
import java.awt.event.*;
import java.io.*;
public class MyMenuTest
{
//创建窗体
private Frame window;
//创建文本框
private TextArea fileInfo;
//创建菜单
private Menu fileMenu;
//创建菜单栏
private MenuBar bar;
//创建子菜单
private MenuItem openItem,saveItem,closeItem;
//创建文件对话框
private FileDialog openDia,saveDia;
//创建文件对象
private File file;
MyMenuTest()
{
init();
}
//窗体初始化
public void init()
{
window = new Frame("我的文件");
//设置窗体布局
window.setBounds(300,100,750,600);
//定义个组件
bar = new MenuBar();
fileInfo = new TextArea();
fileMenu = new Menu("文件");
openItem = new MenuItem("打开");
saveItem = new MenuItem("保存");
closeItem = new MenuItem("退出");
//将文本框添加到窗体
window.add(fileInfo);
//添加子菜单
fileMenu.add(openItem);
fileMenu.add(saveItem);
fileMenu.add(closeItem);
//将菜单添加到菜单栏
bar.add(fileMenu);
//在窗体上显示菜单栏
window.setMenuBar(bar);
//设置文本对话框模式
openDia = new FileDialog(window,"打开",FileDialog.LOAD);
saveDia = new FileDialog(window,"打开",FileDialog.SAVE);
//加载事件
myEvent();
//显示窗体
window.setVisible(true);
}
public void myEvent()
{
//添加窗体监听器
window.addWindowListener(new WindowAdapter()
{
//关闭窗体
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
//给关闭菜单添加监听器
closeItem.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
System.exit(0);
}
});
//给打开菜单添加监听器
openItem.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
//显示文本对话框。
openDia.setVisible(true);
//获取文件对话框目录
String dirPath = openDia.getDirectory();
//获取文件名
String fileName = openDia.getFile();
//判断文件是否为null
if(dirPath==null||fileName==null)
return;
//清空文本框
fileInfo.setText("");
//将文件封装成流对象
file = new File(dirPath,fileName);
//把文件数据读取到文本框
try
{
BufferedReader bufr = new BufferedReader(new FileReader(file));
String line = null;
while((line=bufr.readLine())!=null)
{
fileInfo.append(line+"\r\n");
}
bufr.close();
}
catch (IOException ex)
{
throw new RuntimeException("读取失败");
}
}
});
//给保存菜单添加监听器
saveItem.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
//判断文件是否存在
if(file==null)
{
saveDia.setVisible(true);
String dirPath = saveDia.getDirectory();
String fileName = saveDia.getFile();
if(dirPath ==null||fileName== null)
return;
file = new File(dirPath,fileName);
}
try
{
BufferedWriter bufw = new BufferedWriter(new FileWriter(file));
String text = fileInfo.getText();
bufw.write(text);
//bufw.flush();
bufw.close();
}
catch (IOException ew)
{
throw new RuntimeException("保存失败");
}
}
});
}
public static void main(String[] args)
{
new MyMenuTest();
}
}
十二、将执行文件打成能运行jar包
- 图形化界面需要通过图形化界面的形式运行程序,而不是是用Dos命令行执行,这就需要将程序的class文件打包。
DOS命令生成jar包步骤:
- 导入一个包,没有则需创建一个包,如package mymenu;
- 生成包:通过编译javac -d c:\myclass 类名.java,此时则在c盘下的myclass文件夹下生成了所有的.class文件
- 在此目录下新建一个文件,如info.txt或者其他任意名称任意扩展名的文件都可,然后在其中编辑固定的格式:“Main-Class: mymenu.类名”,只写引号中的内容。
- 写引号中的内容要注意:
- 需要需要在冒号后有一个空格,如果无空格:在编译的时候,就会报IO异常,提示无效的头字段,即invalidheader field。这说明1.txt在被IO流读取。
- 在文件末尾要回车,如果无回车:在列表清单.MF中不会加入相应的加载主类的信息,也就是说配置清单的属性主类名称不会加载进清单中,也就不会执行
- 编译:jar -cvfm my.jar 1.txt mymenu即可。如果想添加其他信息,则直接编译jar即可得出相应的命令
- 此时双击即可执行。
用Eclipse打jar包
- Eclipse通过导出的方式(右键单击项目,之后选择Export)打包java类文件生成jar包。
- 方法一:(在项目工程没有引用外部jar包时,直接导出)
- 选中工程---->右键,Export...--->Java--->JAR file--->next-->选择jar file的路径及名称-->next-->next---> 选择main class--->finish.
- 方法2: 当工程引用了其他的外部jar时,由于eclipse不支持同时导出外部jar包的功能,所以比较麻烦一点;具体步骤如下:
- 生成manifest file:选中工程--->右键,Export--->Java--->JAR file--->选择jar file的路径及名称--->next--->next--->next;
- 方法一:(在项目工程没有引用外部jar包时,直接导出)
注意:
jar文件必须在系统中注册,才能运行。
- 注册方法:
- XP系统:
- 打开任意对话框,在菜单栏点击工具按钮,选择文件夹选项。
- 选择新建,将扩展名设置为jar,确定。
- 选择高级,可更改图标,然后点击新建,命名为open,
- 在用于可执行应用程序中,点浏览,将jdk下的bin的整个文件路径添加进来,并在路径后添加-jar即可。
- win7系统:
- 改变打开方式:右击.jar文件,点击打开方式,选择默认程序为jdk下bin中的javaw.exe应用程序。
- 修改关联程序的注册表:打开注册表(win+r),找到注册表路径\HKEY_CLASSES_ROOT\Aplications\javaw.exe\shell\open\command下的字符串值,右击点修改,在原路径的中添加-jar,如:"C:\ProgramFiles\Java\jre6\bin\javaw.exe" -jar "%1",注意-jar两边要有空格,保存。
- 双击即可执行jar程序,如果仍不能执行,则需下载最新版的jdk。