GUI (Graphical User Interface) 图形用户界面:
当年一个Windows系统覆盖了整个地球,就因其图形化的界面操作。对于非程序开发人员来说,图形界面比命令行的方式要好用的多,人脑对图形的记忆远比记住一些特定的命令轻松。但是对于开发人员来说,制作图形化界面是一件非常麻烦的事情,要写许多重复的代码。所以现在出了很多的界面制作的工具,可以通过控制画图来自动生成代码,不再需要我们去手写了。
这里只是介绍下GUI界面的实现方式以及事件监听机制的原理,让我们能理解GUI界面是通过什么原理实现的。当真正去做的时候,还是用现成的工具方便的多。
Awt和Swing:
1. java.Awt:Abstract Window ToolKit (抽象窗口工具包),需要调用本地系统方法实现功能。属重量级控件。
2. javax.Swing:在AWT的基础上,建立的一套图形界面系统,其中提供了更多的组件,而且完全由Java实现。增强了移植性,属轻量级控件。
GUI构架组成:
布局管理器:
容器中的组件的排放方式,就是布局。
常见的布局管理器:
1. FlowLayout(流式布局管理器)从左到右的顺序排列。Panel默认的布局管理器。
2. BorderLayout(边界布局管理器)东,南,西,北,中Frame默认的布局管理器。
3. GridLayout(网格布局管理器)规则的矩阵
4. CardLayout(卡片布局管理器)选项卡
5. GridBagLayout(网格包布局管理器)非规则的矩阵
通过添加这些容器和组件,加上合理的布局。就能构成一个图形化界面,但是这仅仅是一个界面而已,怎么使它按照我们想要的方式开始工作呢?这就是事件监听机制。
事件监听机制:
2. 通过事件源对象的addXXXListener()方法将侦听器注册到该事件源上。
3. 该方法中接收XXXListener的子类对象,或者XXXListener的子类XXXAdapter的子类对象。
4. 一般用匿名内部类来表示。
5. 在覆盖方法的时候,方法的参数一般是XXXEvent类型的变量接收。
6. 事件触发后会把事件打包成对象传递给该变量。(其中包括事件源对象。通过getSource()或者,getComponent()获取。)
下面创建一个输入路径显示其下文件夹和文件名的界面:
package test;
import java.awt.Button;
import java.awt.Dialog;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Label;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;
public class MyWindowDemo {
private Frame f;
private TextField tf;
private Button but;
private TextArea ta;
private Dialog d;
private Label lab;
private Button okBut;
MyWindowDemo(){
init(); //在构造函数里面创造
}
//创建一个界面里的各种内容,文本框、转到按钮、文本区域、对话框等
public void init(){
f = new Frame("一个显示文件夹里面内容的窗口");
f.setBounds(300, 150, 550, 450);
f.setLayout(new FlowLayout());
tf = new TextField(60);
but = new Button("转到");
ta = new TextArea(25, 60);
d = new Dialog(f, "提示", true);
d.setBounds(400, 300, 270, 120);
d.setLayout(new FlowLayout());
lab = new Label();
okBut = new Button("确定");
d.add(lab);
d.add(okBut);
f.add(tf);
f.add(but);
f.add(ta);
myEvet(); //添加时间监听
f.setVisible(true);
}
public void myEvet(){
//关闭窗口
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
//关闭对话框
d.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e){
d.setVisible(false);
}
});
//关闭对话框
okBut.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
d.setVisible(false);
}
});
//转到操作,按enter键执行
tf.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e){
if(e.getKeyCode()==KeyEvent.VK_ENTER)
showDir();
}
});
//转到操作,鼠标点击转到执行
but.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e){
showDir();
}
});
}
public void showDir(){
String dirPath = tf.getText();
tf.setText(""); //清空文本框
ta.setText(""); //清空文本区域
File file = new File(dirPath);
if( file.exists() && file.isDirectory()){
String[] names = file.list();
for(String name: names){
ta.append(name+"\r\n");
}
}
else{
String info = "你输入的路径:"+dirPath+"不存在,请重新输入";
lab.setText(info);
d.setVisible(true); //让对话框出现
}
}
public static void main(String args[]){
new MyWindowDemo(); //创建界面
}
}
这样就能执行出和我们一般打开文件夹的效果来:
GUI界面的布局不是需要重点掌握的内容,我们需要详细了解的就是事件监听机制,如何写出执行效果来。