第七节 GUI 图形用户界面
1. Swing 概述
Java中针对GUI设计提供了基本图形用户接口开发工具,如AWT、Swing、和JavaFX。其中AWT逐渐被Swing取代
Swing组件继承关系:
Swing组件都继承自Container类,主要有两个分支:容器分支(包括Window窗口和Panel面板)和组件分支。常见顶级容器JApplet、JFrame和JDialog,常用的组件类有按钮组件,和JTextComponent类及其子类。
2. 顶级容器
2.1 JFrame容器
它是一个顶级容器,用来放其他组件和容器的,它不能放在别的容器内。
使用方法如下:
public class JFrameDemo {
public static void main(String[] args) {
//使用SwingUtilities工具类调用createAndShowGUI()方法显示GUI程序
/**
* SwingUtilities里面的invokeLater()方法可以开启一个新的线程来显示窗口
*/
SwingUtilities.invokeLater(JFrameDemo::createAndShowGUI);
}
public static void createAndShowGUI(){
//创建并设置JFrame容器窗口
JFrame frame=new JFrame("JFrame顶级窗口");
//设置关闭窗口时的默认操作
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//设置窗口尺寸
frame.setSize(250,150);
//展示JFrame容器窗口
frame.setVisible(true);
}
}
2.2 JDialog容器
通常用来表示对话框窗口,可以分为两种:模态和非模态,如果处于模态,我们需要先区处理完这个模态窗口才能继续去和其他窗口进行交互,如果是非模态,那么我们可以继续和其他窗口进行交互。通过setModal(boolean mode)方法可以进行模态和非模态的设置。
创建JDialog的三种构造方法:
方法声明 | 功能描述 |
---|---|
JDialog(Frame owner) | 构造方法,用来创建一个非模态的对话框,owner为对话框所有者(顶级窗口JFrame) |
JDialog(Frame owner,String title) | 构造方法,创建一个具有指定标题的非模态对话框 |
JDialog(Frame owner,boolean modal) | 创建一个有指定模式的无标题对话框 |
使用如下:
public class JDialogDemo {
public static void main(String[] args) {
SwingUtilities.invokeLater(JDialogDemo::createAndShowGUI);
}
private static void createAndShowGUI(){
//创建顶级容器
JFrame jFrame=new JFrame("顶级窗口");
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.setSize(340,150);
jFrame.setVisible(true);
JDialog dialog=new JDialog(jFrame,"JDialog对话框");
dialog.setDefaultCloseOperation(JDialog.HIDE_ON_CLOSE);
dialog.setSize(200,100);
dialog.setVisible(true);
}
}
3. 布局管理器
Swing 工具提供了8中布局管理器,分别为BorderLayout(边界布局管理器)、BoxLayout(箱式布局管理器)、CardLayout(卡片布局管理器)、FlowLayout(流式布局管理器)、GridBagLayout(网格包布局管理器)、GridLayout(网格布局管理器)、GroupLayout(分组布局管理器)和SpringLayout(弹性布局管理器)
3.1 BorderLayout(边界布局管理器)
它将容器划分为五个部分,分别是页头(PAGE_START)、页尾(PAGE_END)、行首(LINE_START)、行尾(LINE_END)、中部(CENTER)
使用如下:
public class BorderLayoutDemo {
private static void createAndShowGUI(){
JFrame jframe=new JFrame("顶级窗口");
jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jframe.setSize(300,400);
jframe.setLayout(new BorderLayout());
Button btn1=new Button("PAGE_START");
Button btn2=new Button("PAGE_END");
Button btn3=new Button("LINE_START");
Button btn4=new Button("LINE_END");
Button btn5=new Button("CENTER");
jframe.add(btn1,BorderLayout.PAGE_START);
jframe.add(btn2,BorderLayout.PAGE_END);
jframe.add(btn3,BorderLayout.LINE_START);
jframe.add(btn4,BorderLayout.LINE_END);
jframe.add(btn5,BorderLayout.CENTER);
jframe.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(BorderLayoutDemo::createAndShowGUI);
}
}
效果如下图:
注意:如果添加的时候不指明放到那个区域,那么就会默认放在CENTER区域,如果多个都没指明,后面的会覆盖掉前面的。
3.2 FlowLayout(流式布局管理器)
容器会将组件按照添加顺序从左向右放置,当达到容器的边界时,会自动将组件放到下一行的开始位置。组件可以按照左对齐,居中对齐(默认)或右对齐的方式排列。
FlowLayout构造方法:
方法声明 | 功能描述 |
---|---|
FlowLayout() | 组件默认居中对齐,水平、垂直间距默认为5个单位 |
FlowLayout(int align) | 指定组件相对于容器的对齐方式,水平、垂直默认为5个单位 |
FlowLayout(int align, int hgap,int vgap) | 指定组件的对齐方式和水平、垂直间距 |
对于对齐方式,FlowLayout.LEFT表示左对齐、FlowLayout.CENTER表示居中对齐、FlowLayout.RIGHT表示右对齐。
例如:如下使用
public class FlowLayoutDemo {
private static void createAndShowGUI(){
//创建顶级容器
JFrame jFrame=new JFrame("顶级容器");
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.setSize(300,400);
jFrame.setLayout(new FlowLayout(FlowLayout.LEFT,20,30));
jFrame.setLocation(300,200);
jFrame.add(new Button("btn1"));
jFrame.add(new Button("btn2"));
jFrame.add(new Button("btn3"));
jFrame.add(new Button("btn4"));
jFrame.add(new Button("btn5"));
jFrame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(FlowLayoutDemo::createAndShowGUI);
}
}
效果如下:
3.3 GridLayout (网格布局管理器)
使用纵横线将容器分为n行m列大小相等的网格,组件自动占据网格的整个部分,从左到右放置组件。
GridLayout构造方法:
方法声明 | 功能描述 |
---|---|
GridLayout() | 默认只有一行,每个组件占一列 |
GridLayout(int rows,int cols) | 指定容器的行数和列数 |
GridLayout(int rows,int cols,int hgap,intvgap) | 指定容器的行数和列数以及组件之间的水平、垂直间距 |
使用示例如下:
public class GridLayoutDemo {
private static void createAndShowGUI(){
JFrame f=new JFrame("GridLayout");
f.setSize(400,300);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setLocation(300,500);
f.setLayout(new GridLayout(3,3));
for (int i=1;i<9;i++){
Button btn=new Button("btn"+i);
f.add(btn);
}
f.setVisible