GUI图形编程-Swing
1.Swing简介
-
Swing API可扩展GUI组件,以减轻开发者的生活创造基于JAVA前端/GUI应用。它是建立在AWT API之上,并作为AWT API的更换,因为它几乎每一个控制对应AWT控制。
-
Swing 组件遵循MVC(模型-视图-控制器)架构,MVC让负责显示的代码、处理数据的代码、对交互进行响应并驱动变化的代码彼此分离。
-
Swing包含了构建图形界面(GUI)的各种组件,如:窗口、标签、按钮、文本等。
-
Swing提供了许多比AWT更好的屏幕显示元素,使用纯JAVA实现,能够实现更好的兼容跨平台实现。
-
为了和AWT组件区分,Swing组件在javax.swing.*包下,类名均以J开头,例如:JFrame\JLabel\JButton等。
2.Swing组件
一个Java图形界面,由各种不同类型的“元素”组成,例如:窗口、菜单栏、对话框、标签、按钮、文本框等等,这些“元素”统一被称为组件(component)。
组件按照不同的功能,可分为 顶层容器、中间容器、基本组件。一个简单的窗口的组成,如下层级结构所示: -
顶层容器
- 菜单栏
- 中间容器
- 基本组件
- 基本组件
组件类型的继承关系:
- 顶层容器,属于窗口类组件,继承自java.awt.Window;
- 中间容器和基本组件继承自javax.swing.JComponent
2.1顶层容器
顶层容器属于窗口类组件,可以独立显示,一个图形界面至少需要一个窗口,例如:
组件 | 描述 |
---|---|
JFrame | 一个普通的窗口(绝大多数Swing图形界面程序使用JFrame作为顶层容器) |
JDialog | 对话框 |
2.2中间容器
中间容器充当基本组件的载体,不可独立显示。中间容器可以添加若干基本组件(也可以嵌套添加中间容器),对容器内的组件进行管理,类似于给各种复杂的组件进行分组管理。最顶层的一个中间容器必须依托在顶层容器(窗口内)。
常用的中间容器(面板):
组件 | 描述 |
---|---|
JPanel | 一个轻量级面板容器组件 |
JScrollPane | 带滚动条的,可以水平和垂直滚动的面板组件 |
JSplitPane | 分割面板 |
JTabbedPane | 选项卡面板 |
JLayeredPane | 层级面板 |
2.3基本组件
基本组件是直接实现人机交互的组件。
常用的简单的基本组件:
组件 | 描述 |
---|---|
JLabel | 标签 |
JButton | 按钮 |
JRadioButton | 单选按钮 |
JCheckBox | 复选框 |
JToggleButton | 开关按钮 |
JTextField | 文本框 |
JPasswordField | 密码框 |
JTextAre | 文本区域 |
JComboBox | 下拉列表框 |
JList | 列表 |
JProgressBar | 进度条 |
JSlider | 滑块 |
选取器组件
组件 | 描述 |
---|---|
JFileChooser | 文件选取器 |
JColorChooser | 颜色选取器 |
其他较为复杂的基本组件:
组件 | 描述 |
---|---|
JTable | 表格 |
JTree | 树 |
3.布局管理器
把 Swing的各种组件( JComponent)添加到面板容器中( JPane),需要给面板容器指定布局管理器( LayoutManager),明确容器( Container)内的各个组件之间的排列布局方式。
常用的布局管理器:
# | 布局管理器 | 描述 |
---|---|---|
1 | FlowLayout | 流式布局,按组件加入的顺序,按照水平方向排列,排满一行换下一行继续排列 |
2 | GridLayout | 网格布局,把Container按指定行数分隔出若干网格,每一个网格按顺序放置一个控件 |
3 | GridBagLayout | 网格袋布局,按网格划分Container,每一个组件可占用一个或者多个网格,可将组件垂直/水平或者沿他们的基线对齐 |
4 | BoxLayout | 箱式布局,将Container中的多个组件按照水平或者垂直的方向排列 |
5 | GroupLayout | 分组布局,将组件按照层次分组(串行或并行)。分别确定组件组在水平和垂直方向上的位置 |
6 | CardLayout | 卡片布局,将Container中的每个组件看作一张卡片,一次只能显示一张卡片,默认显示第一张卡片。 |
7 | BorderLayout | 边界布局,把Container按照方位分为5个区域(东、西、南、北、中),每个区域放置一个组件。 |
8 | SpringLayout | 弹性布局,通过定义组件四条边的坐标位置来实现布局 |
9 | null | 绝对布局,通过设置组件在Container中的坐标来放置组件 |
4.Swing代码小实例
import javax.swing.*;
public class Main{
public static void main(String []args){
//1.创建一个顶层容器(窗口)
JFrame jf = new JFrame("窗口");
jf.setSize(250,250);
jf.setLocationRelativeTO(null);//把窗口位置设置到屏幕中心
jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//当前窗口的关闭
//2.创建中间容器(面板容器)
JPanel panel = new Panel();//创建面板容器使用默认的布局管理器
//3.创建一个基本组件(按钮),并添加到面板容器中
JButton button = new JButton("测试按钮");
panel.add(button);
//4.把面板容器作为窗口的内容面板设置到窗口
Container container = jf.getContentPane();
container.add(panel);
//5.显示窗口,前面创建的信息都在内存中,通过jf.setVisible(true)把内存中的窗口显示在屏幕上。
jf.setVisible(true);
}
}
结果展示:
5.Swing组件代码实例
5.1新建一个JFrame窗口(带标签)
package com.xzit.lesson04;
import java.awt.Color;
import java.awt.Container;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.WindowConstants;
public class jFrameDemo {
//init();初始化
public void init() {
//顶级窗口
JFrame jf = new JFrame("这是一个JFrame窗口");
jf.setVisible(true);
jf.setBounds(100, 100, 200, 200);
//设置文字 Jlable
JLabel lable = new JLabel("欢迎来到狂神说Java系列节目");
jf.add(lable);
//获得一个容器,容器实例化
Container Container = jf.getContentPane();
Container.setBackground(Color.blue);
jf.getContentPane();
//关闭事件
jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
//建立一个窗口
new jFrameDemo().init();
}
}
结果展示:
5.2图片标签化
package com.xzit.lesson04;
import java.awt.Container;
import java.awt.Image;
import java.awt.Label;
import javax.print.DocFlavor.URL;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import javax.swing.WindowConstants;
public class ImageIconDemo extends JFrame {
public ImageIconDemo() {
//获取图片的地址
JLabel label = new JLabel("ImageIcon");
java.net.URL url = ImageIconDemo.class.getResource("宁宁.jpg");
ImageIcon imageIcon =new ImageIcon(url);//命名不要冲突
label.setIcon(imageIcon);
label.setHorizontalAlignment(SwingConstants.CENTER);
Container container = getContentPane();
container.add(label);
setVisible(true);
setDefaultCloseOperation(WindowConstants