GUI
一、GUI
1.1、概述
GUI:Graphical User Interface(图形用户接口),用图形的方式与用户进行交互,使得操作更加简单易懂,计算机的推广很大的功劳来源于GUI。
CLI:CommandLine User Interface(命令行用户接口),即Dos命令行操作,需要记住常用指令,早期的计算机就是这种形式,操作不直观,windows系统中,基本被GUI替代,但在Linux系统中仍然有相当重要的地位。
在java中,操作GUI的组件以及方法等等都封装在awt和swing两个工具包中。
java.awt:Abstract Window Toolkit(抽象窗口工具包),重量级控件;需要调用本地系统方法实现功能。
Javax.Swing:是在awt的基础上,建立的一套图形化界面系统,轻量级控件;其中提供了更多的组件,而且完全由java实现,不依赖本地系统。
awt中常用组件的关系如下图所示:
注意:Container:即容器,是一个特殊的组件,该组件中可以通过add方法添加其他的组件。
布局管理器:即容器中各组件的排放方式。
常见的布局管理器:
FlawLayout(流式布局管理器):从左到右的顺序排列,Panel默认;
BorderLayout(边界布局管理器):东、南、西、北、中,Frame默认;
GridLayout(网格布局管理器):规矩的矩形;
CardLayout(卡片布局管理器):选项卡;
GridBagLayout(网格包布局管理器):非规则的矩形。
创建图形化界面的步骤:
1、创建frame窗体;
2、对窗体进行基本设置;比如:大小、位置、布局等等;
3、定义组件;
4、将组件通过窗体的add方法添加到窗体中;
5、让窗体显示,通过setVisible(true)完成。
1.2、事件监听机制
事件监听机制由事件源、事件、监听器、事件处理四个部分组成。
事件源:就是awt或者swing包中的那些图形界面组件;
事件:每一个事件源都有自己特有的对应事件和共性事件;
监听器:用于封装可以触发某一事件的动作;
事件处理:以上三者,在java中都已经定义好了,直接获取其对象即可;我们需要做的,就是事件处理。
事件监听机制如下图所示:
事件监听机制的实现:1、确定事件源(容器或者组件);2、通过事件源对象的addXxxListener()方法将监听器注册到该事件源上;3、该方法接收的是XxxListener的子类对象,或者XxxAdapter的子类对象,一般用匿名内部类表示;4、覆盖特定事件的方法。
注意:XxxAdapter是Xxxlistener的子类,复写了所有的抽象方法,但由于创建对象无意义,所以XxxAdapter定义为抽象类 。因为WindowListener的子类windowAdapter已经实现了windowListener接口,并覆盖了其中的所有方法,那么我们只要继承自windowadapter,并覆盖我们需要的方法即可。总之,适配器继承于监听器,并覆盖了相应的方法,使用适配器不必覆盖多余的方法。
常用的监听器有:窗体监听器WindowListener,活动监听器ActionListener,鼠标监听器MouseListener,键盘监听器KeyListener。当监听器有三个及三个以上的方法时,一般都有相匹配的适配器!
菜单
菜单:MenuBar、Menu、MenuItem;先创建菜单条,再创建菜单,每一个菜单中建立菜单项;也可以菜单添加到菜单中,作为子菜单;通过setMenuBar()方法,将菜单添加到Frame中。
菜单的继承关系如下图所示:
1、基本的演示:
package itheima.day22;
import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
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.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class FrameDemo {
/*1、定义该图形中所需的组件引用*/
private Frame f;
private Button but;
private TextField tf;//文本区域
FrameDemo(){
init();
}
public void init(){
f = new Frame("这是一个框架");
//对frame进行基本设置
f.setBounds(200, 300, 400, 500);//设置,位置,大小
f.setLayout(new FlowLayout());//设置流式布局,默认是边界布局
but = new Button("一个按钮");
tf = new TextField(20);//指定列数
//将组件添加到frame中
f.add(but);
f.add(tf);
//加载一下窗体上事件
myEvent();
//显示窗体
f.setVisible(true);
}
private void myEvent(){
//给窗体增加监听的功能,
f.addWindowListener(
new WindowAdapter(){
@Override
public void windowClosing(WindowEvent e) {//关闭窗口
System.exit(0);
}
});
//按钮的活动监听
but.addActionListener(new ActionListener(){//活动监听器
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("action ok");
//System.out.println("按钮退出程序");
//System.exit(0);
}
});
//监听鼠标事件
but.addMouseListener(new MouseAdapter(){//鼠标监听器
int enter;
int clicked;
@Override
public void mouseClicked(MouseEvent e) {
if(e.getClickCount()==2)
System.out.println("双击按钮:"+clicked++);
//System.out.println("点击按钮:"+clicked++);
}
@Override
public void mouseEntered(MouseEvent e) {
System.out.println("鼠标进入按钮::"+enter++);
}
});
tf.addKeyListener(new KeyAdapter(){//键盘监听器
@Override
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 FrameDemo();
}
}
2、演示在窗体中显示文件列表
package itheima.day22;
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,100,600,500);//设置位置,大小
f.setLayout(new FlowLayout());//设置流式布局
tf = new TextField(70);//文本行
but = new Button("转到");//按钮
ta = new TextArea(25,70);//文本区域
d = new Dialog(f,"提示信息--self",true);//对话框,模式为true,模态形式
d.setBounds(400,200,400,250);
d.setLayout(new FlowLayout());
lab = new Label();//标签
okBut = new Button("确定");
d.add(okBut);//对话框中添加一个按钮
d.add(lab);//对话框中添加一个标签
f.add(tf);//给窗体添加组件
f.add(but);
f.add(ta);
myEvent();//事件监听
f.setVisible(true);//可视化
}
private void myEvent(){
f.addWindowListener(new WindowAdapter(){
@Override
public void windowClosing(WindowEvent e) {//窗体的关闭功能
System.exit(0);
}
});
d.addWindowListener(new WindowAdapter(){
@Override
public void windowClosing(WindowEvent e) {//对话框的关闭功能
d.setVisible(false);
}
});
tf.addKeyListener(new KeyAdapter(){
@Override
public void keyPressed(KeyEvent e) {//文本行的接收键盘输入的功能
if(e.getKeyCode() == KeyEvent.VK_ENTER)//回车
showDir();
}
});
okBut.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {//对话框中确定按钮的活动监听
d.setVisible(false);
}
});
but.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {//窗体中转到按钮的活动监听
showDir();
}
});
}
private void showDir(){//显示目录
String dirPath = tf.getText();//获取文本行里面的内容
File dir = new File(dirPath);//封装成为一个File对象,方便操作
if(dir.exists() && dir.isDirectory()){//存在并且是一个文件夹
String[] names = dir.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();
}
}
3、演示打开保存文件的功能
package itheima.day22;
import java.awt.FileDialog;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;
import java.awt.TextArea;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class MyMenuDemo {
private Frame f;//窗体
private MenuBar bar;//菜单栏
private Menu fileMenu,subMenu;//菜单
private MenuItem closeItem,subItem;//菜单条
private MenuItem openItem,saveItem;//打开、保存、菜单条
private FileDialog openDia,saveDia;//文件对话框
private TextArea ta;//文本区域,用于显示打开文件的内容
private File file;//文件
MyMenuDemo(){
init();
}
public void init(){
//窗体
f = new Frame("my window");
f.setBounds(300,100,500,600);
f.setLayout(new FlowLayout());
bar = new MenuBar();//菜单栏
fileMenu = new Menu("文件");
//subMenu = new Menu("子菜单");
subItem = new MenuItem("子条目");
closeItem = new MenuItem("退出");
openItem = new MenuItem("打开");
saveItem = new MenuItem("保存");
ta = new TextArea(30,60);
//subMenu.add(subItem);
//m.add(subMenu);
fileMenu.add(openItem);//菜单中加入打开菜单
fileMenu.add(saveItem);//保存
fileMenu.add(closeItem);//关闭
bar.add(fileMenu);//在菜单栏中添加菜单
f.setMenuBar(bar);//窗体中增加菜单栏
f.add(ta);//窗体中加入文本区域
openDia = new FileDialog(f,"打开",FileDialog.LOAD);//打开对话框
saveDia = new FileDialog(f,"保存",FileDialog.SAVE);//保存对话框
myEvent();//事件
f.setVisible(true);//窗体的可视化
}
private void myEvent(){
f.addWindowListener(new WindowAdapter(){
@Override
public void windowClosing(WindowEvent e) {//窗体关闭功能
System.exit(0);
}
});
closeItem.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {//关闭菜单项的关闭功能
System.exit(0);
}
});
openItem.addActionListener(new ActionListener(){//打开菜单项的活动监听
@Override
public void actionPerformed(ActionEvent e) {
openDia.setVisible(true);//显示打开对话框
String dirPath = openDia.getDirectory();
String fileName = openDia.getFile();
if(dirPath ==null || fileName == null)
return ;
ta.setText("");//清空文本区域
file = new File(dirPath,fileName);//将路径和文件名封装成为对象
try {
BufferedReader bufr = new BufferedReader(new FileReader(file));//读取文件中的数据
String line = null;
while((line = bufr.readLine())!= null)
{
ta.append(line +"\r\n");//追加到文本区域中
}
bufr.close();
} catch (IOException e1) {
throw new RuntimeException("文件读写异常");
}
}
});
saveItem.addActionListener(new ActionListener(){//保存菜单项的活动监听
@Override
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);//封装成FIle对象,方便操作
}
try {
BufferedWriter bufw = new BufferedWriter(new FileWriter(file));//写入流
/*写入到指定的文件中*/
String text = ta.getText();
bufw.write(text);
bufw.flush();
bufw.close();
} catch (IOException e1) {
throw new RuntimeException("文件读写异常");
}
}
});
}
public static void main(String[] args) {
new MyMenuDemo();
}
}