GUI界面及事件处理
顶层容器
- JFrame:一个带有标题行和控制按钮的独立窗口,创建应用程序时需要使用JFrame。
- JDialog:创建对话框。
- JWindow:一个不带有标题行和控制按钮的窗口,通常很少使用 。
import javax.swing.*;
// 必须继承JFrame类
public class Demo22 extends JFrame {
public Demo22() {
// 调用父类构造方法,并指定窗口标题
super("无界软件");
// 设置窗口大小,单位为像素
this.setSize(400, 300);
// 设置窗口左上角坐标
this.setLocation(200, 100);
// // 设置窗体边界,完全确定窗体的大小和位置
// this.setBounds(200,100,400,300);
// 设置窗口关闭方式为退出应用程序
// 结束窗体所在的应用程序
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// // 不做任何事情
// this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
// // 隐藏当前窗口
// this.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
// // 隐藏当前窗口,并释放窗体占有的其它资源
// this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
// 设置窗口可见
this.setVisible(true);
// 设置窗口是否可调大小,默认可调
this.setResizable(true);
}
public static void main(String[] args) {
// 实例化一个对象
new Demo22();
}
}
面板
面板不能独立存在,必须被添加到其他容器内部
面板可以嵌套,由此可以设计出复杂的图形用户界面
import javax.swing.*;
import java.awt.*;
public class Demo23 extends JFrame {
// 声明一个面板对象
private JPanel panel;
// 声明两个按钮对象
private JButton button1,button2;
public Demo23(){
super("面板Demo");
// 实例化面板对象,默认流式布局
panel = new JPanel();
// 实例化一个按钮对象,该按钮上文本为“确认”
button1 = new JButton("确认");
button2 = new JButton("取消");
// 将按钮添加添加到面板中
panel.add(button1);
panel.add(button2);
// 将面板添加到窗体中
this.add(panel);
// 设置窗口大小
this.setSize(400,300);
// 设置窗口位置
this.setLocation(200,100);
// 设置默认关闭模式
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 设置窗口可见
this.setVisible(true);
}
public static void main(String[] args) {
new Demo23();
}
}
滚动面板
JScrollPane类的对象中放置的组件可以任意大,通过滚动条来观察整个组件
// 声明一个滚动面板
private JScrollPane panel;
public Demo23(){
// 实例化一个滚动面板对象
panel = new JScrollPane();
}
分割面板
ØJSplitPane类的对象被称为拆分窗格。
- 拆分窗格有水平拆分和垂直拆分
- 水平拆分把容器分为左右两部分
- 垂直拆分把容器分为上下两部分
- 拆分线可以移动
public JSplitPane(int a,view1,view2)
// 其中,a为拆分方式,可以取值为
// JSplitPane.HORIZONTAL_SPLIT
// JSplitPane.VERTICAL_SPLIT
// view1和view2是组件
setDividerLocation(double position)
// 设置拆分线的位置
布局
流式布局
- 在容器中,从左到右依次放置GUI组件,当组件排到容器一行的末尾时,则从下一行开始接着排列组件
- 每行组件的对齐方式可以是: 左对齐、中间(默认对齐方式)和右对齐
// 创建面板
panel = new JPanel();
// 创建一个流式布局对象,左对齐,水平间距10,垂直间距15
FlowLayout layout = new FlowLayout(FlowLayout.LEFT,10,15);
// 设置面布局
panel.setLayout(layout);
panel = new JPanel(new FlowLayout(FlowLayout.LEFT,10,15));
边界布局
- 将JFrame容器分成NORTH (顶部)、SOUTH (底部)、WEST (左侧)、EAST (右侧)、CENTER (中间)五个区域。
- 每个区域最多只能1个组件。
- 在进行布局时,四周的组件先被放置,剩余的空间由位于中间的组件占用;当容器的大小改变时,四周组件的厚度不会被改变,而中间组件的大小需要改变。
- 若某个区域没有组件,则其他组件也可以占据空间。
- 如果北部没有组件,则东西部组件可以向上扩展,占据上部。
- 如果东西部没有组件,则中间组件可以扩展到容器的左右边界。
import javax.swing.*;
import java.awt.*;
public class Demo24 extends JFrame {
private JPanel jPanel;
private JButton jButton1, jButton2, jButton3, jButton4, jButton5;
public Demo24() {
super("边界布局");
jPanel = new JPanel();
// 创建一个边界管理布局对象,并将该布局放置在面板中
jPanel.setLayout(new BorderLayout());
// 创建按钮
jButton1 = new JButton("按钮1");
jButton2 = new JButton("按钮2");
jButton3 = new JButton("按钮3");
jButton4 = new JButton("按钮4");
jButton5 = new JButton("按钮5");
// 将按钮放置到指定位置
jPanel.add(jButton1, BorderLayout.EAST);
jPanel.add(jButton2, BorderLayout.WEST);
jPanel.add(jButton3, BorderLayout.SOUTH);
jPanel.add(jButton4, BorderLayout.NORTH);
jPanel.add(jButton5, BorderLayout.CENTER);
// 将面板添加到窗体中
this.add(jPanel);
// 设置位置和大小
this.setBounds(200, 100, 300, 200);
// 设置关闭模式
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 设置可见
this.setVisible(true);
}
public static void main(String[] args) {
new Demo24();
}
}
网格布局GridLayout
- GridLayout是定义在java.awt包中布局管理器。
- 将容器空间划分成若干行乘若干列的网格,组件依次放入其中,每个组件占据一格。
- 网格每列的宽(高)度都是相同的,这个宽度大致等于容器的宽度除以网格的列(行)数。
- 组件被放入容器的次序决定了它所占据的位置。每行网格从左至右依次填充,一行用完之后转入下一行。
- 当容器的大小改变时,GridLayout所管理的组件的相对位置不会发生变化,但组件的大小会随之改变。
public GridLayout()
// 创建一个只有一行的网格,网格的列数根据实际需要而定
public GridLayout(int rows, int cols)
// rows和cols两个参数分别指定网格的行数和列数 rows和cols中的一个值可以为0,但是不能两个都是0。
public GridLayout(int rows, int cols, int hgap, int vgap)
// hgap和vgap分别表示网格间的水平间距和垂直间距
jPanel = new JPanel();
jPanel.setLayout(new GridLayout());
卡片布局
- CardLayout是定义在java.awt包中的布局管理器。
- 将容器中的组件处理为一系列卡片,每一时刻只显示出其中的一张。
public CardLayout()
// 组件距容器左右边界和上下边界的距离为缺省值0
public CardLayout(int hgap, int vgap)
// 组件距容器左右边界和上下边界的距离为指定值
Void first(Container parent)
// 翻转到容器的第一张卡片
Void next(Container parent)
// 翻转到容器的下一张卡片
Void previous(Container parent)
// 翻转到容器的前一张卡片
Void last(Container parent)
// 翻转到容器的最后一张卡片
Void show(Container parent,String name)
// 显示指定卡片
import javax.swing.*;
import java.awt.*;
public class Demo26 extends JFrame {
private JPanel jPanel;
private JButton[] jButtons;
// 声明卡片布局管理器
private CardLayout cardLayout;
public Demo26(){
super("卡片布局");
// 实例化卡片布局管理器
cardLayout = new CardLayout();
// 实例化面板,其布局为卡片布局
jPanel = new JPanel(cardLayout);
// 实例化按钮
jButtons = new JButton[6];
for (int i = 0; i < jButtons.length; i++) {
jButtons[i]=new JButton("按钮"+(i+1));
}
for (int i = 0; i < jButtons.length; i++) {
jPanel.add("第"+i+"张",jButtons[i]);
}
this.add(jPanel);
cardLayout.last(jPanel);
// cardLayout.show(jPanel,"第3张");
this.setBounds(200,100,300,200);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
public static void main(String[] args) {
new Demo26();
}
}
盒布局BoxLayout
- BoxLayout是定义在javax.swing包中的布局管理器。
- 将容器中的组件按水平方向排成一行或按垂直方向排成一列。
- 当组件排成一行时,每个组件可以有不同的宽度;
- 当组件排成一列时,每个组件可以有不同的高度。
BoxLayout(Container target,int axis)
// Container型参数target指明是为哪个容器设置此BoxLayout布局管理器
// int型参数axis指明组件的排列方向,
// BoxLayout.X_AXIS 水平方向排列,BoxLayout.Y_AXIS 垂直方向排列
行型盒布局
Box.createHorizontalBox()
// 获得一个具有行型盒式布局的盒式容器行型盒式布局容器中添加的组件的上沿在 同一水平线上
Box box = Box.createHorizontalBox();
列型盒布局
Box.createVerticalBox()
// 获得一个具有列型盒式布局的盒式容器列型盒式布局容器中添加的组件的上沿在同一垂直线上
Box box = Box.createVerticalBox();
import javax.swing.*;
import java.awt.*;
public class Demo25 extends JFrame {
private JPanel jPanel;
// 声明按钮数组
private JButton[] buttons;
public Demo25() {
super("盒布局");
// 面板实例
jPanel = new JPanel();
jPanel.setLayout(new BoxLayout(jPanel, BoxLayout.Y_AXIS));
// 实例化按钮组的长度
buttons = new JButton[6];
// 循环实例化按钮
for (int i = 0; i < buttons.length; i++) {
buttons[i] = new JButton("按钮" + (i + 1));
}
// 循环添加按钮
for (int i = 0; i < buttons.length; i++) {
jPanel.add(buttons[i]);
}
// 添加面板至窗体
this.add(jPanel);
// 设置位置和大小
this.setBounds(200, 100, 300, 300);
// 设置默认关闭模式
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 设置可见
this.setVisible(true);
}
public static void main(String[] args) {
new Demo25();
}
}
空布局NULL
- 调用容器的setLayout(null)将布局管理器设置为空。
- 调用组件的setBounds()方法设置组件的位置和大小。
setBounds(int x,int y,int width,int height)
// 前两个int型参数设置组件的位置,后两个int型参数设置组件的宽度和高度
事件处理
用户操作产生一个事件后,事件将被事件源所绑定的事件监听器进行监听并捕获,随后事件监听器调用相应的事件处理方法进行处理。
事件处理步骤
- 创建监听类,实现监听接口并重写监听接口中的事件处理方法。
- 创建监听对象,即实例化上一步中所创建的监听类的对象。
- 注册监听对象,调用组件中的addXXXListener方法将监听对象注册到相应组件上,以便监听对事件源所触发的事件。