知识点总结于毕向东Java基础视频教程25天版本,侵权请联系删除。
GUI
GUI
概述
- 图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面。
- 用图形的方式,来显示计算机操作的界面,这样更方便更直观。
CLI (Command line User Interface 命令行用户接口):
- 就是常见的Dos命令行操作。
- 需要记忆一些常用的命令,操作不直观。
Java为GUI提供的对象都存在java.Awt和javax.Swing两个包中。
- java.Awt:Abstract Window ToolKit (抽象窗口工具包 ),需要调用本地系统方法实现功能。属重量级控件。
- javax.Swing:在AWT的基础上,建立的一套图形界面系统,其中提供了更多的组件,而且完全由Java实现。增强了移植性,属轻量级控件。
继承关系
- Container常用子类:Window Panel(面板, 不能单独存在)
- Window常用子类:Frame Dialog
布局
容器中的组件的排放方式,就是布局。
- 常见的布局管理器:
- FlowLayout(流式布局管理器)
- 从左到右的顺序排列。
- Panel默认的布局管理器。
- BorderLayout(边界布局管理器)
- 东,南,西,北,中
- Frame默认的布局管理器。
- GridLayout(网格布局管理器)
- 规则的矩阵
- GridBagLayout(网格包布局管理器)
- 非规则的矩阵
- CardLayout(卡片布局管理器)
- 选项卡
- FlowLayout(流式布局管理器)
建立一个简单的窗体
import java.awt.*;
class Demo
{
public static void main(String[] args){
Frame frame=new Frame("this is my first frame");//设置了标题
frame.setVisible(true);//设置窗体为显示状态
frame.setSize(300,200);//设置窗体大小
frame.setLocation(200,200);//设置窗体在窗口中出现的位置
frame.setLayout(new FlowLayout());//设置窗体的布局方式,默认为BorderLayout
frame.add(new Button("click"));//添加按钮控件
}
}
事件监听机制
Java事件监听机制在Java图形界面编程处常用。我们会对界面做一些操作,比如输入框输入数据,点击登录按钮等等。这些操作被称为事件,当采取这些操作之后,程序会采取一定的措施响应。
事件监听机制组成:
- 事件源(组件)
就是awt包或者swing包中的那些图形界面组件。 - 事件(Event)
每一个事件源都有自己特有的对应事件和共性事件。 - 监听器(Listener)
将可以触发某一个事件的动作(不只一个动作)都已经封装到了监听器中。 - 事件处理(引发事件后处理方式)
对产生的动作进行相应的处理。
前三者,在java中都已经定义好了。直接获取其对象来用就可以了。
窗体事件(WindowEvent)
WindowListener是java中的接口。
主要作用:用于接收窗口事件的侦听器接口。旨在处理窗口事件的类要么实现此接口(及其包含的所有方法),要么扩展抽象类 WindowAdapter(仅重写所需的方法)。然后使用窗口的 addWindowListener 方法将从该类所创建的侦听器对象向该 Window 注册。当通过打开、关闭、激活或停用、图标化或取消图标化而改变了窗口状态时,将调用该侦听器对象中的相关方法,并将 WindowEvent 传递给该方法。
由于WindowListener是接口,所以我们需要找到实现它的子类WindowAdapter,但是该类属于抽象类,因为它的方法都是空方法,没有具体的内容,创建该类对象没有意义。这是为了我们不需要再通过实现WindowListener接口,再重新实现接口中的所有方法。
所以可以用过两种事件处理方式:
1.只需要自定义一个类继承WindowAdapter再复写自己需要的处理窗体事件的方法。
2.或者直接定义WindowAdapter匿名内部类复写方法。
WindowAdapter方法:
void windowActivated(WindowEvent e):激活窗口时调用,即当窗口在最前面。
void windowClosed(WindowEvent e):当窗口关闭时调用。
void windowClosing(WindowEvent e):当窗口处于关闭状态时调用。
void windowDeactivated(WindowEvent e):当窗口被禁用时调用。
void windowDeiconified(WindowEvent e):当窗口被去图标化时调用。
void windowGainedFocus(WindowEvent e):当窗口设置为聚焦窗口时调用,这意味着窗口或其子组件之一将接收
键盘事件。
void windowIconified(WindowEvent e):当窗口被图标化时调用。
void windowLostFocus(WindowEvent e):当窗口不再是聚焦窗口时调用,这意味着键盘事件将不再传递到窗口或
其任何子组件。
void windowOpened(WindowEvent e):当窗口打开时调用。
void windowStateChanged(WindowEvent e):当窗口状态改变时调用。
import java.awt.*;
import java.awt.event.*;
class Demo
{
public static void main(String[] args){
Frame frame=new Frame("this is my first frame");
frame.setVisible(true);
frame.setSize(300,200);
frame.setLocation(200,200);
frame.setLayout(new FlowLayout());
Button button = new Button("click");
frame.add(button);
//添加窗体监听器
frame.addWindowListener(new WindowAdapter()
{
public void windowOpened(WindowEvent e){
System.out.println("window opened");
}
public void windowActivated(WindowEvent e){
System.out.println("window activated");
}
public void windowClosing(WindowEvent e){
System.out.println("window closing");
System.exit(0);//status为0时为正常退出程序,也就是结束当前正在运行中的java虚拟机。
}
});
}
}
Action事件(ActionEvent)
actionlistener是一个接口,ActionEvent通常在点击一个按钮或双击某个列表项或选中某个菜单时发生。
与WindowListener不同的是,ActionListener没有相应的适配器(例如WindowAdapter),这是因为ActionListener中的方法只有一个,使用者不需要像实现WindowListener那样复写多余的方法。
void actionPerformed(ActionEvent e):发生动作时调用。
import java.awt.*;
import java.awt.event.*;
class Demo
{
public static void main(String[] args){
Frame frame=new Frame("this is my first frame");
frame.setVisible(true);
frame.setSize(300,200);
frame.setLocation(200,200);
frame.setLayout(new FlowLayout());
Button button = new Button("click");
button.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e){
System.out.println("button closing");
System.exit(0);
}
});
frame.add(button);
}
}
鼠标事件(MouseEvent)
指组件中发生鼠标操作的事件。
MouseAdapter用于接收鼠标事件的抽象适配器类(方法超过2个就有适配器)。 这个类中的方法是空的, 因为此类作为创建侦听器对象的方便而存在(与窗体事件同理,避免因为实现父类接口从而需要复写多种方法)。
MouseAdapter构造方法:
MouseAdapter()
方法摘要:
void mouseClicked(MouseEvent e):在组件上单击(按下并释放)鼠标按钮时调用。
void mouseDragged(MouseEvent e):在组件上按下鼠标按钮然后拖动时调用。
void mouseEntered(MouseEvent e):当鼠标进入组件时调用。
void mouseExited(MouseEvent e):当鼠标退出组件时调用。
void mouseMoved(MouseEvent e):当鼠标光标移动到组件上但没有按钮被按下时调用。
void mousePressed(MouseEvent e):在组件上按下鼠标按钮时调用。
void mouseReleased(MouseEvent e):在组件上释放鼠标按钮时调用。
void mouseWheelMoved(MouseWheelEvent e):当鼠标滚轮旋转时调用。
import java.awt.*;
import java.awt.event.*;
class Demo
{
public static void main(String[] args){
Frame frame=new Frame("this is my first frame");
frame.setVisible(true);
frame.setSize(300,200);
frame.setLocation(200,200);
frame.setLayout(new FlowLayout());
Button button = new Button("button");
button.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e){
System.out.println("action"); //action事件会在点击事件发生之后继续执行
}
});
frame.add(button);
button.addMouseListener(new MouseAdapter()
{
public void mouseEntered(MouseEvent e){
//鼠标触碰到组件
System.out.println("mouse entered");
}
public void mouseExited(MouseEvent e){
//鼠标离开组件
System.out.println("mouse exited");
}
public void mouseClicked(MouseEvent e){
//MouseEvent类中的方法:获取与此事件关联的鼠标点击次数
if(e.getClickCount()==2)
System.out.println("mouse doubleclicked");
}
});
}
}
键盘事件(KeyEvent)
组件中发生击键的事件。当按下,释放或键入键时,此低级别事件由组件对象(例如文本字段)生成。 该事件传递给每个KeyListener或KeyAdapter对象,该对象使用组件的addKeyListener方法注册接收此类事件。当事件发生时,每个这样的侦听器对象获得这个KeyEvent 。
KeyAdapter对象实现KeyListener接口(适配器),因为KeyListener中有三个方法。
KeyAdapte构造方法:
KeyAdapter()
方法摘要:
void keyPressed(KeyEvent e):按下键时调用。
void keyReleased(KeyEvent e):当键已被释放时调用。
void keyTyped(KeyEvent e):键入键时调用。
import java.awt.*;
import java.awt.event.*;
class Demo
{
public static void main(String[] args){
Frame frame=new Frame("this is my first frame");
frame.setVisible(true);
frame.setSize(300,200);
frame.setLocation(200,200);
frame.setLayout(new FlowLayout());
Button button = new Button("button");
frame.add(button);
button.addKeyListener(new KeyAdapter()
{
public void keyPressed(KeyEvent e){
//返回与此事件中的键相关联的字符,如果按SHIFT等多个字母组成的键就会失败
System.out.println(e.getKeyChar());
//通过键盘上按下键的键值获取对应的键名,包括SHIFT等功能键
System.out.println(e.getKeyText(e.getKeyCode()));
//调用KeyEvent类中的静态常量(代表键盘上的键)和方法判断是否相继按下了CTRL键和ENTER键
if(e.getKeyCode()==KeyEvent.VK_ENTER&&e.isControlDown())
System.out.println("CTRL+ENTER run");
}
});
TextField tf=new TextField(20);
frame.add(tf);
tf.addKeyListener(new KeyAdapter()
{
public void keyPressed(KeyEvent e){
int code=e.getKeyCode();
//只能输入0-9的数字
if(!(code==KeyEvent.VK_0 && code==KeyEvent.VK_9)){
System.out.println("输入非法");
//通过KeyEvent中父类InputEvent的方法consume消耗掉此事件,即文本框中不会存在此次事件中键入的非法值
e.consume();
}
}
});
}
}
事件监听机制
- 确定事件源(容器或组件);
- 通过事件源对象的addXXXListener()方法将侦听器注册到该 事件源上;
- 该方法中接收XXXListener的子类对象,或者XXXListener的子类XXXAdapter的子类对象;
- 一般用匿名内部类来表示;
- 在覆盖方法的时候,方法的参数一般是XXXEvent类型的变量接收;
- 事件触发后会把事件打包成对象传递给该变量。(其中包括事件源对象,通过getSource()或者getComponent()获取)
对话框(Dialog)
Dialog类和Frame类都是window的子类。对话框必须依赖于某个窗口或组件,当它所依赖的窗口或组件消失时,对话框也消失;当它所依赖的窗口或组件可见时,对话框会自动恢复。
主要用法:
1.Dialog(Frame f,String s):构造一个具有标题s的初始不可见的对话框,f是对话框所依赖的窗口。
2.Dialog(Frame f,String s,boolean b):
构造一个具有标题s的初始不可见的对话框,f是对话框所依赖的窗口,b决定对话框是有模式或无模式。
//有模式代表对话框出现无法选中依赖窗口,无模式可以选中对话框依赖窗口。
3.getTitle():获取对话框的标题。
4.setTitle():设置对话框的标题。
5.setModal(boolean b):设置对话框的模式。
6.setSize():设置对话框的大小。
7.setVisible(boolean b):显示或隐藏对话框。
FileDialog
FileDialog 类显示出一个对话框窗口,用户可以从中选择文件。
因为它是一个模式对话框,当应用调用它的 show 方法来显示对话框时,它会阻塞应用的其余部分直到用户选择了一个文件。
构造方法:
FileDialog(Dialog parent):创建一个加载文件的文件对话框。
FileDialog(Dialog parent, String title):创建一个文件对话框窗口,其中包含用于加载文件的指定标题。
FileDialog(Dialog parent, String title, int mode) 创建一个带有指定标题的文件对话窗口,用于加载或保存文件。
FileDialog(Frame parent):创建一个加载文件的文件对话框。
FileDialog(Frame parent, String title):创建一个文件对话框窗口,其中包含用于加载文件的指定标题。
FileDialog(Frame parent, String title, int mode):创建一个带有指定标题的文件对话窗口,用于加载或保存文件。
静态常量(int mode):
LOAD:该常量值表示文件对话窗口的目的是找到要从中读取的文件。
SAVE:该常量值表示文件对话窗口的目的是找到要写入的文件。
菜单
窗口菜单是由菜单条(MenmBar)、 菜单(Memu)、菜单项(Menltem)和复选菜单项CeckoMonultem等组成的。菜单放在菜单条里,菜单项放在菜单里。
- MenuBar,Menu,MenuItem
- 先创建菜单条,再创建菜单,每一个菜单中建立菜单项。
- 也可以菜单添加到菜单中,作为子菜单。
- 通过setMenuBar()方法,将菜单添加到Frame 中。
菜单继承体系:
import java.awt.*;
import java.awt.event.*;
class Demo
{
private Frame f;
private MenuBar mb;
private Menu m,subMenu;
private MenuItem closeItem,subItem;
Demo()
{
init();
}
public void init()
{
f = new Frame("my window");
f.setBounds(300,100,500,600);
f.setLayout(new FlowLayout());
mb = new MenuBar();
m = new Menu("文件");
subMenu = new Menu("子菜单");
subItem = new MenuItem("子条目");
closeItem = new MenuItem("退出");
subMenu.add(subItem);
m.add(subMenu);
m.add(closeItem);
mb.add(m);
f.setMenuBar(mb);
myEvent();
f.setVisible(true);
}
private void myEvent()
{
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 Demo();
}
}