一、GUI概述
Graphical User Interface(图形用户接口):用图形的方式,来显示计算机操作的界面,这样更方便更直观;
Java为GUI提供的对象都存在java.Awt和javax.Swing两个包中。
Component 类的继承关系图:
常用类介绍:
1、component是一个具有图形表示能力的对象,可在屏幕上显示,并可与用户进行交互。典型图形用户界面中的按钮、复选框和滚动条都是组件示例;Component 类是与菜单不相关的 Abstract Window Toolkit 组件的抽象超类;
2、Window对象是一个没有边界和菜单栏的顶层窗口,窗口的默认布局是 BorderLayout;
3、Frame是带有标题和边框的顶层窗口,窗体的默认布局为 BorderLayout;
4、Dialog是一个带标题和边界的顶层窗口,边界一般用于从用户处获得某种形式的输入;
5、FileDialog类显示一个对话框窗口,用户可以从中选择文件;
6、Button此类创建一个标签按钮,当按下该按钮时,应用程序能执行某项动作;
7、Label对象是一个可在容器中放置文本的组件,一个标签只显示一行只读文本;
8、TextComponent类是所有允许编辑文本的组件的超类;
9、TextField对象是允许编辑单行文本的文本组件;
10、TextArea对象是显示文本的多行区域,可以将它设置为允许编辑或只读。
二、事件监听机制
事件监听机制的特点:事件源、事件、监听器、处理方式;
1、事件源:就是awt或者swing包中的那些图形界面组件;
2、事件:每一个事件源都有自己特有的对应事件和共性事件;
3、监听器:将可以触发某一个事件的动作(不只一个动作)已经封装到了监听器中;同时也封装了事件的处理方式。
在Java中,以上三者都已经定义好了,直接获取其对象利用即可,我们要做的,就是对产生的动作进行处理。
三、制作窗体的实例
要求:1、能够通过按扭和窗口X关闭窗体;
2、注入键盘和鼠标事件;
3、在窗体中创建TextField和TextArea;
4、在TextField中输入文件目录,点击按扭,在TextArea中输出目录中所有文件;
5、如果目录不存在,提未错误信息。
package blog.itheima;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
class MyWindowGUI {
private Frame frame; //定义一个窗体
private TextField textField;//定义一个文件编辑行
private TextArea textArea; //定义一个文件显示区域
//定义三个按扭,跳转、确认、关闭窗体
private Button go,ok,close;
//定义提示信息的对话框
private Dialog dialog;
//对话框中要输入的内容标签,一行只读文本
private Label label;
//初始化本类对象
MyWindowGUI(){
init();
}
public void init(){
frame = new Frame("我的窗口");
/*void setBounds(int x,int y,int w,int h)
移动组件并调整其大小,由x和y指定左上角的新位置,由w和h指定宽高*/
frame.setBounds(300,200,500,300);
/*FlowLayout:流式布局管理器,从左到右,Panel默认的布局
BorderLayout:边界布局,东,南,西,北,中,Frame默认的布局
GridLayout:网格布局管理器,规则的矩阵
CardLayout:卡片布局管理器,选项卡
GridBagLayout:网格包布局管理器,非规则的矩阵*/
frame.setLayout(new FlowLayout());
//构造具有指定列数的新空文本字段,列是近似平均字符宽度,与平台有关
textField = new TextField(40);
//构造一个新文本区,该文本区具有指定的行数和列数,初始为空
textArea = new TextArea(12,56);
//定义Button的名称
go = new Button("转到");
close = new Button("关闭窗口");
/*创建dialog对象,三个参数:dialog的所有者,标题,处理模式
ture,不处理不能进行下一步;为false,可以放在一边,继续做其它事情*/
dialog = new Dialog(frame,"温馨提示",true);
dialog.setBounds(400,300,300,100);
dialog.setLayout(new FlowLayout());
//定义初始为空的标签,后续输入内容
label = new Label();
ok = new Button("确定");
dialog.add(label);
dialog.add(ok);
frame.add(textField);
frame.add(go);
frame.add(close);
frame.add(textArea);
event();
//把窗体设置为可见的
frame.setVisible(true);
}
private void event(){
//通过内部类,复写关闭窗口的方法,定义窗口监听,退出程序
frame.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.out.println("窗口关闭");
System.exit(0);
}
});
/*close按扭监听,退出程序;ActionListener没有适配合器,
方法只有一个,用于接收操作事件的侦听器接口。*/
close.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
System.out.println("按扭关闭");
System.exit(0);
}
});
//ok按扭监听,如果触发,把dialog设置为不可见
ok.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
dialog.setVisible(false);
}
});
//文本行键盘监听,
textField.addKeyListener(new KeyAdapter(){
public void keyPressed(KeyEvent e){
if(e.getKeyCode()==KeyEvent.VK_ENTER)
//如果输入ENTER键,调用show方法
show();
//同时按下Control和C,程序退出
if(e.isControlDown() && e.getKeyCode()
==KeyEvent.VK_C)
System.exit(0);
}
});
go.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
show();
}
});
//在go按扭上注入鼠标事件
go.addMouseListener(new MouseAdapter(){
int count = 1;
public void mouseClicked(MouseEvent e){
//if(e.getClickCount()==2)
//System.out.println("鼠标双击"+count++);
System.out.println("鼠标点击"+count++);
}
public void mouseEntered(MouseEvent e){
System.out.println("鼠标进入"+count++);
}
public void mouseExited(MouseEvent e){
System.out.println("鼠标离开"+count++);
}
});
}
public void show(){
//用文本行中得到键盘录入的数据,即目录
String dirPath = textField.getText();
//将目录封装成对象
File dir = new File(dirPath);
if(/*dir.exists() && */dir.isDirectory()){
//清空文本区域,防止上次的输入残留
textArea.setText("");
String[] names = dir.list();
for(String name : names){
textArea.append(name+"\r\n");
}
} else {
label.setText("您输入了错误路径:"+dirPath+",请重新输入");
dialog.setVisible(true);
}
}
public static void main(String[] args) {
new MyWindowGUI();
}
}