GUI(图形用户界面)
人机交互的两种方式:1,图形用户接口;2,命令行用户接口
GUI
Graphical User Interface(图形用户接口)。用图形的方式,来显示计算机操作的界面,这样更方便更直观。
CLI
Command line User Interface (命令行用户接口)就是常见的Dos命令行操作。需要记忆一些常用的命令,操作不直观。
Java为GUI提供的对象都存在java.Awt和javax.Swing两个包中。
Awt与 Swing
java.Awt:Abstract Window ToolKit (抽象窗口工具包),需要调用本地系统方法实现功能。属重量级控件。javax.Swing:在AWT的基础上,建立的一套图形界面系统,其中提供了更多的组件,而且完全由Java实现。增强了移植性,属轻量级控件。还有一种是IBM公司开发的Swt工具包
Awt的继承体系
Container:为容器,是一个特殊的组件,该组件中可以通过add方法添加其他组件进来。
布局管理器
容器中的组件的排放方式,就是布局。
常见的布局管理器:
常见的布局管理器:
FlowLayout(流式布局管理器)从左到右的顺序排列。Panel默认的布局管理器。BorderLayout(边界布局管理器)东,南,西,北,中Frame默认的布局管理器。GridLayout(网格布局管理器)规则的矩阵CardLayout(卡片布局管理器)选项卡GridBagLayout(网格包布局管理器)非规则的矩阵坐标式布局管理器
创建图形化界面
创建图形化界面的步骤:1,创建frame窗体。2,对窗体进行基本设置。比如大小,位置,布局。3,定义组件。4,将组件通过窗体的add方法添加到窗体中。5,让窗体显示,通过setVisible(true)
代码示例:
import java.awt.*;
class AwtDemo
{
public static void main(String[] args)
{
//创建Frame窗体
Frame f = new Frame("我的窗体");
//对窗体进行基本设置:大小,位置,布局等
f.setSize(500,400);
f.setLocation(400,400);
f.setLayout(new FlowLayout());
//**********************************
Button b = new Button("aniu");
f.add(b);
//**********************************
//让窗体显示
f.setVisible(true);
}
}
事件监听机制
通过上面程序发现,该程序创建的窗体可以正常的最大化和最小化,关闭按钮却没有效果,这时就用到了事件监听机制
时间监听机制流程图
事件监听机制组成部分
1,事件源(组件)2, 事件(Event)3, 监听器(Listener)4, 事件处理(引发事件后处理方式)
事件源:就是awt包或者swing包中的那些图形界面组件。
事件:每一个事件源都有自己特有的对应事件和共性事件。
监听器:将可以触发某一个事件的动作(不只一个动作)都已经封装到了监听器中。
事件:每一个事件源都有自己特有的对应事件和共性事件。
监听器:将可以触发某一个事件的动作(不只一个动作)都已经封装到了监听器中。
我对事件监听机制的理解:
人身体的条件反射可以很好的理解事件监听机制。我们的大脑就是一个监听器,时刻监听着身体的每一部分,这时如果有锤子敲击(事件源)膝盖时,膝盖部位的神经将会通过神经中枢向大脑传递信号(事件对象),大脑也会对此作出相应的回应,踢腿(事件处理)
我们要做的就是对产生的动作进行处理:
处理过程:首先我们需要定义一个监听器来监听动作,但是我们并没有在Fram类中找到调用事件监听器相关的方法,到Fram类的父类Window类中找,找到addWindowListener(WindowListener l )方法,该方法中需要传入一个WindowListener,这是个接口,使用里面的方法需要全部复写,发现其实现子类WindowApdater类中已经把这些方法复写了,所以在传递WindowListener时,可以使用 匿名内部类简化书写,并复写WindowAdapter中使用的方法即可
代码示例:
/**
创建窗口
设置监听器
*/
import java.awt.*;
import java.awt.event.*;
class CloseDemo
{
public static void main(String[] args)
{
Frame f = new Frame("演示窗口");
f.setSize(500,400);
f.setLocation(500,200);
f.setLayout(new FlowLayout());
Button b = new Button("关闭按钮");
f.add(b);
//添加窗体监听,因为时间源是窗体
f.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
f.setVisible(true);
}
}
事件监听器定义的规律:
1,确定事件源(容器或组件)2,通过事件源对象的addXXXListener()方法将侦听器注册到该事件源上。3,该方法中接收XXXListener的子类对象,或者XXXListener的子类XXXAdapter的子类对象。4,一般用匿名内部类来表示。5,在覆盖方法的时候,方法的参数一般是XXXEvent类型的变量接收。事件触发后会把事件打包成对象传递给该变量。(其中包括事件源对象。通过getSource()或者,getComponent()获取。)
事件的分类及对应的监听器和适配器:
1,窗体事件addWindowListener(WindowEvent e ) 适配器: WindowAdapter2,Action事件(按钮事件)addActionListener(WindowEvent e) 没有适配器3,鼠标事件addMouseListener(MouseEvent e ) 适配器:MouseAdapter4,键盘事件addKeyListener(KeyEvent e ) 适配器:KeyAdapter
规律总结:
监听器都是接口,如果此接口中的方法超过3个,那么这个监听器肯定有与其对应的适配器,适配器中已经将监听器中的所有方法全部复写了,所以通常情况下不是实现监听器来处理事件,而是使用匿名内部类 来创建适配器的对象。处理事件的功能通常在对应的Event事件对象中
/**
创建窗口
设置监听器
*/
import java.awt.*;
import java.awt.event.*;
class CloseDemo
{
public static void main(String[] args)
{
Frame f = new Frame("演示窗口");
f.setSize(500,400);
f.setLocation(500,200);
f.setLayout(new FlowLayout());
Button b = new Button("关闭按钮");
Button b1 = new Button("操作按钮");
Button b2 = new Button("获取键盘");
f.add(b);
f.add(b1);
f.add(b2);
//添加窗体监听,因为时间源是窗体
f.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
//按钮监听事件
b.addActionListener(new ActionListener()
{
public void actionPerformed (ActionEvent e)
{
System.exit(0);
}
});
//鼠标监听事件
b1.addMouseListener(new MouseAdapter()
{
public void mouseClicked(MouseEvent e)
{
System.out.println(e.getClickCount());
}
});
//键盘监听事件
b2.addKeyListener(new KeyAdapter()
{
public void keyPressed(KeyEvent e)
{
System.out.println(e.getKeyChar());
}
});
f.setVisible(true);
}
}
对话框
对话框的特点:
由与之关联的窗体,如果对话框不关闭,与之关联的窗体不能进行任何操作
菜单栏
菜单的继承体系
先创建菜单条,再创建菜单,每一个菜单中建立菜单项。也可以菜单添加到菜单中,作为子菜单。通过setMenuBar()方法,将菜单添加到Frame中。
记事本程序源码
/**
记事本
*/
import java.awt.*;
import java.awt.event.*;
import java.io.*;
public class TxtDemo
{
private Frame f;
private MenuBar bar;
private TextArea ta;
private Menu fileMenu;
private MenuItem openItem,saveItem,closeItem;
private FileDialog openDia,saveDia;
private File file;
TxtDemo()
{
init();
}
public void init()
{
f = new Frame("my window");
f.setBounds(300,100,650,600);
bar = new MenuBar();
ta = new TextArea();
fileMenu = new Menu("文件");
openItem = new MenuItem("打开");
saveItem = new MenuItem("保存");
closeItem = new MenuItem("退出");
fileMenu.add(openItem);
fileMenu.add(saveItem);
fileMenu.add(closeItem);
bar.add(fileMenu);
f.setMenuBar(bar);
openDia = new FileDialog(f,"打开",FileDialog.LOAD);
saveDia = new FileDialog(f,"保存",FileDialog.SAVE);
f.add(ta);
myEvent();
f.setVisible(true);
}
private void myEvent()
{
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 = ta.getText();
bufw.write(text);
bufw.close();
}
catch (IOException ex)
{
throw new RuntimeException();
}
}
});
openItem.addActionListener(new ActionListener()
{
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 ex)
{
throw new RuntimeException("读取失败");
}
}
});
closeItem.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
System.exit(0);
}
});
f.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
}
public static void main(String[] args)
{
new TxtDemo();
}
}
如何制作可以双击执行的jar包呢?
1,将多个类封装到了一个包(package)中。2,定义一个jar包的配置信息。定义一个文件a.txt 。文件内容内容为:Main-Class:(空格)包名.类名(回车)3,打jar包。jar -cvfm my.jar a.txt 包名4,通过winrar程序进行验证,查看该jar的配置文件中是否有自定义的配置信息。5,通过工具--文件夹选项--文件类型--jar类型文件,通过高级,定义该jar类型文件的打开动作的关联程序。jdk\bin\javaw.exe -jar6,双击