- GUI概述
- GUI:Graphical User Interface(图形用户接口)。
- 用图形的方式,来显示计算机操作的界面,这样更方便更直观。
- CLI:Command line User Interface (命令行用户接口)。
- 就是常见的Dos命令行操作。
- 需要记忆一些常用的命令,操作不直观。
- 就是常见的Dos命令行操作。
- Java为GUI提供的对象都存在java.Awt和javax.Swing两个包中。
- java.Awt:Abstract Window ToolKit (抽象窗口工具包)
- 需要调用本地系统方法实现功能。属重量级控件。
- javax.Swing:
- 在AWT的基础上,建立的一套图形界面系统,其中提供了更多的组件,而且完全 由Java实现。增强了移植性,属轻量级控件。、
- 在AWT的基础上,建立的一套图形界面系统,其中提供了更多的组件,而且完全 由Java实现。增强了移植性,属轻量级控件。、
- 继承关系图:
- Container:为容器,是一个特殊的组件,该组件中可以通过add 方法添加其他组件进来。
- GUI:Graphical User Interface(图形用户接口)。
- 布局管理器
- 布局
- 容器中的组件的排放方式,就是布局。
- 容器中的组件的排放方式,就是布局。
- 常见的布局管理器
- FlowLayout(流式布局管理器):
- 从左到右的顺序排列。
- Panel默认的布局管理器。
- 从左到右的顺序排列。
- BorderLayout(边界布局管理器):
- 东,南,西,北,中。
- 如果不指定方向,则居中填充,多个组件的话填充覆盖。
- Frame\Dialog默认的布局管理器。
- 东,南,西,北,中。
- GridLayout(网格布局管理器):
- 规则的矩阵。
- 规则的矩阵。
- CardLayout(卡片布局管理器):
- 选项卡。
- 选项卡。
- GridBagLayout(网格包布局管理器):
- 非规则的矩阵。
- 非规则的矩阵。
- 坐标式布局管理器:
- 组件可以放在任意位置。
- 组件可以放在任意位置。
- FlowLayout(流式布局管理器):
- Frame
- 图形化界面是由主线程以外的另一个线程运行的。主线程要等所有其他前台线程都结束以后才能结束。
- 创建图形化界面:
- 创建Frame窗体。
- 对窗体进行基本设置(大小、位置、布局等)。
- 定义组件。
- 将组件通过窗体的add方法添加到窗体中。
- 让窗体显示,通过setVisible(true)。
- 创建Frame窗体。
- 代码举例:
程序执行效果:弹出窗体如图package cn.itcast.heima; import java.awt.*; class AwtDemo { public static void main(String[] args) { Frame f = new Frame("my wat"); f.setSize(200,150); f.setLocation(300,200); f.setLayout(new FlowLayout());//设置为流式布局 Button b = new Button("按钮"); f.add(b); f.setVisible(true); } }
- 事件监听机制
- 事件监听机制流程图
- 事件监听机制组成
- 事件源(组件)
- awt包或者swing包中的那些图形界面组件。
- awt包或者swing包中的那些图形界面组件。
- 事件(Event)
- 每一个事件源都有自己特有的对应事件和共性事件。
- 每一个事件源都有自己特有的对应事件和共性事件。
- 监听器(Listener)
- 封装了可以触发某一个事件的动作(不止一个)。
- 封装了可以触发某一个事件的动作(不止一个)。
- 事件处理(引发事件后处理方式)
- 事件源(组件)
- 事件监听机制的实现步骤:
- 确定事件源(容器或组件)。
- 通过事件源对象的addXXXListener()方法将侦听器注册到该事件源上。
- 该方法中接收XXXListener的子类对象,或者XXXListener的子类XXXAdapter的子类对象。一般用匿名内部类来表示。
- 在覆盖方法的时候,方法的参数一般是XXXEvent类型的变量接收。
- 事件触发后会把事件打包成对象传递给该变量。(其中包括 事件源对象。通过getSource()或者,getComponent()获取。)
- 确定事件源(容器或组件)。
- 窗体事件
- 代码举例:
程序执行效果:点击关闭按钮,窗口关闭。//通过关闭按钮关闭窗体。 package cn.itcast.heima; import java.awt.*; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; class AwtDemo { public static void main(String[] args) { Frame f = new Frame("my wat"); f.setSize(200,150); f.setLocation(300,200); f.setLayout(new FlowLayout()); Button b = new Button("按钮"); f.add(b); //添加窗体事件监听 f.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.exit(0); } }); f.setVisible(true); } }
- 代码举例:
- Action事件
- 代码举例:
程序执行效果:点击按钮b,窗口关闭。//为按钮添加活动监听 package cn.itcast.heima; import java.awt.Button; import java.awt.FlowLayout; import java.awt.Frame; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; class AwtDemo { private Frame f; private Button b; public AwtDemo(){ ini(); } void ini(){ f = new Frame("my wat"); f.setSize(200,150); f.setLocation(300,200); f.setLayout(new FlowLayout()); b = new Button("按钮"); f.add(b); myEvent(); f.setVisible(true); } private void myEvent(){ //添加Action监听 b.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { System.exit(0); } }); } public static void main(String[] args) { new AwtDemo(); } }
- 代码举例:
- 鼠标事件
- 代码举例:
程序执行效果:双击按钮b,窗口关闭。//判断鼠标双击动作 package cn.itcast.heima; import java.awt.Button; import java.awt.FlowLayout; import java.awt.Frame; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; class AwtDemo { private Frame f; private Button b; public AwtDemo(){ ini(); } void ini(){ f = new Frame("my wat"); f.setSize(200,150); f.setLocation(300,200); f.setLayout(new FlowLayout()); b = new Button("按钮"); f.add(b); myEvent(); f.setVisible(true); } private void myEvent(){ //鼠标事件监听 b.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { if (e.getClickCount() == 2) { System.exit(0); } } }); } public static void main(String[] args) { new AwtDemo(); } }
- 代码举例:
- 键盘事件
- 代码举例:
程序执行效果:文本框只能显示键盘录入的数字。按钮b获得焦点后,按下Ctrl+Enter,窗口关闭。//判断键盘动作,如果在按钮b上按下Ctrl+Enter,关闭窗口 //判断文本输入框中的键盘录入,如果不是数字,不能输入 package cn.itcast.heima; import java.awt.Button; import java.awt.FlowLayout; import java.awt.Frame; import java.awt.TextField; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; class AwtDemo { private Frame f; private Button b; private TextField tf; public AwtDemo(){ ini(); } void ini(){ f = new Frame("my wat"); f.setSize(200,150); f.setLocation(300,200); f.setLayout(new FlowLayout()); tf = new TextField(20); b = new Button("按钮"); f.add(tf); f.add(b); myEvent(); f.setVisible(true); } private void myEvent(){ //按钮b的键盘事件监听 b.addKeyListener(new KeyAdapter() { @Override public void keyPressed(KeyEvent e) { int code = e.getKeyCode(); if (code == KeyEvent.VK_ENTER && e.isControlDown()) { System.exit(0); } } }); //文本输入框的键盘事件监听 tf.addKeyListener(new KeyAdapter() { @Override public void keyPressed(KeyEvent e) { int code = e.getKeyCode(); if (code < KeyEvent.VK_0 || code > KeyEvent.VK_9) { e.consume(); } } }); } public static void main(String[] args) { new AwtDemo(); } }
- 代码举例:
- 菜单
- 菜单继承体系
- 菜单操作
- MenuItem:菜单项,表示最后一级菜单,没有子菜单或子菜单项。
- Menu:菜单,可以对其继续添加子菜单或子菜单项。
- MenuBar类的add(Menu m)方法可以向菜单栏中添加菜单。
- Menu类的add(MenuItem mi)方法可以向菜单中添加菜单项。由于Menu是MenuItem的子类,因此该方法也可以向菜单中添加菜单。
- MenuItem类的addActionListener(ActionListener l)方法可以添加动作监听。
- MenuItem:菜单项,表示最后一级菜单,没有子菜单或子菜单项。