Swing程序设计
Swing为GUI(图形用户界面)提供开发工具包,使用Swing开发的应用程序可以统一应用程序在不同平台上运行的GUI组件显示风格,因为在Swing组件可以跨平台指定统一风格和外观
特点:
- 轻量级组件
- 可插入外观组件
Swing包
使用Swing组件前,先了解层次结构和继承关系
![](https://sanscan12.gitee.io/blogimg/Content/Java/Java03.png)
常用的Swing组件
组件名称 | 说明 |
---|---|
JButton(按钮) | 按钮可以带些图片或文字 |
JCheckBox(多选按钮) | 复选框组件 |
JComBox(下拉框) | 代表下拉列表框,可以在下拉显示区域显示多个选项 |
JFrame(窗体) | Swing的框架类 |
JDialog(对话框) | Swing版本的对话框 |
JLable(标签) | 标签组件(显示文字的容器) |
JRadioButton(单选按钮) | Swing的单选按钮 |
JList(列表框) | 显示一系列条目的组件 |
JTextField(文本框) | 文本框 |
JPasswordField(密码框) | 密码框 |
JTextArea(文本域) | Swing的文本区域 |
JOptionPane(小对话框) | 对话框 |
JPanel(面板) | 单纯的容器,无属性 |
窗体
窗体常用方法
setTitle(String title) 窗体标题为title字符串
setDefaultCloseOperation(int a) 窗体关闭规则
setSize(width,height) 窗体大小
setLocation(x,y) 窗体坐标
setBounds(x,y, width , height) 窗体坐标,大小 (像素)
setVisible(boolean b) 窗体是否显示,默认不可见(false)
setResizable(boolean b) 窗体是否可以调整大小,默认可以调整大小
setContentPane(容器) 重新加载容器
getContentPane() 获取窗体容器
JFrame 窗体
Class JFrame
java.lang.Object
java.awt.Component
java.awt.Container
java.awt.Window
java.awt.Frame
javax.swing.JFrame
JFrame窗体拥有计算机基本组件,最大化,最小化,关闭等组件
构造方法
JFrame()
JFrame(Starting title)
title: 窗体标题
import javax.swing.*;
import java.awt.*;
public class Demo {
public static void main(String[] args) {
//123为标题
JFrame f = new JFrame("123");
//窗体显示
f.setVisible(true);
//窗口关闭规则
f.setDefaultCloseOperation(3);
// f.setSize(330,220);//大小
// f.setLocation(202,202);//坐标
//坐标,大小 (x , y , width , height)单位:像素
f.setBounds(200,200 , 300,300);
//获取窗体容器
Container c = f.getContentPane();
//背景颜色
c.setBackground(Color.CYAN);
//标签内容
JLabel l = new JLabel("这是一个窗体!!");
//添加组件
c.add(l);
}
}
也可以
import javax.swing.*;
import java.awt.*;
public class Demo2 extends JFrame {
public Demo2(){
//窗体显示
setVisible(true);
//窗口关闭规则
setDefaultCloseOperation(3);
// f.setSize(330,220);//大小
// f.setLocation(202,202);//坐标
//坐标,大小 (x , y , width , height)单位:像素
setBounds(200,200 , 300,300);
//获取窗体容器
Container c = getContentPane();
//背景颜色
c.setBackground(Color.CYAN);
//标签内容
JLabel l = new JLabel("这是一个窗体!!");
//添加组件
c.add(l);
//删除组件
c.remove(l);
//验证容器中的组件
c.validate();
//重新载入容器
setContentPane(c);
}
public static void main(String[] args) {
new Demo2();
}
}
运行结果
![](https://sanscan12.gitee.io/blogimg/Content/Java/Java01.png)
JDialog 窗体
Class JDialog
java.lang.Object
java.awt.Component
java.awt.Container
java.awt.Window
java.awt.Dialog
javax.swing.JDialog
JDialog窗体是Swing的对话框,是从一个窗体中弹出另一个窗体,它继承了AWT组件中的
在一个类继承窗体类时,可以在构造方法中使用 super关键字 可调用回窗体类的参数填充
构造方法
JDialog()
JDialog(Frame f)
JDialog(Frame f , boolean model)
JDialog(Frame f , String title)
JDialog(Frame f , String title , boolean model)
f: 需要指定的父窗体
model: 指定类型的对话框(是否约束父窗体)
title: 对话框的标题
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
//JFrame父窗体类
class Parentform extends JFrame {
JButton btn;
public Parentform(){
//为父类添加标题
super("JFrame父窗体的标题");
//窗体关闭规则
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
//窗体显示
setVisible(true);
//窗体坐标,大小
setBounds(300,230,400,340);
//获取窗体容器
Container c = getContentPane();
//布局设置,使用流布局
c.setLayout(new FlowLayout());
//使类的btn共享到以下类输出
this.btn = new JButton("对话框");
//添加组件
c.add(btn);
}
public JButton btn(){
//输出组件添加动作监听
return btn;
}
}
//对话框类
class Dialog extends JDialog{
public Dialog(Parentform p){
//参数顺序: 1.父窗体对象 , 2.对话框标题 ,3.是否堵塞父窗体
super(p,"123对话框",true);
//获取对话框容器
Container c = getContentPane();
//对话框添加标签(内容)
c.add(new JLabel("这是对话框!"));
//对话框坐标,大小
setBounds(360,300,120,100);
}
}
public class Demo {
public static void main(String[] args) {
//实例JFrame父窗体类
Parentform p = new Parentform();
//添加动作监听
p.btn().addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//实例对话框类,并获取p父窗体对象
Dialog d = new Dialog(p);
//显示对话框
d.setVisible(true);
}
});
//也可以 p.btn().addActionListener(e -> new Dialog());
}
}
运行结果
![](https://sanscan12.gitee.io/blogimg/Content/Java/Java02.png)
窗体关闭规则
窗体的关闭规则是需要到 setDefaultCloseOperation()方法来选择关闭方式的
关闭类型 | 说明 | 定义 |
---|---|---|
DO_NOTHING_ON_CLOSE | 无任何操作 | 0 |
HIDE_ON_CLOSE(默认) | 隐藏窗体,不停止程序 | 1 |
DISPOSE_ON_CLOSE | 释放窗体资源 | 2 |
EXIT_ON_CLOSE | 隐藏窗体,停止程序 | 3 |
图标
JLable 标签
Class JLabel
java.lang.Object
java.awt.Component
java.awt.Container
javax.swing.JComponent
javax.swing.JLabel
可以显示只读文本、图像,但不能产生任何类型的事件,只是简单的显示文本和图像,还可以设置标签上文本的对齐方式
构造方法
JLable()
JLable(String text)
JLable(Icon icon)
JLable(Icon icon , int aligment)
JLable(String text , int aligment)
JLable(String text , Icon icon , int aligment)
text: 标识性,文字标签
icon: 图标对象
aligment: 设置对齐方式
常用方法
修饰符、类型 | 方法 | 说明 |
---|---|---|
void | setText(String text) | 定义组件内容(更改) |
String | getText() | 返回标签显示的文本字符串 |
void | setIcon(Icon icon) | 添加图片文件 |
void | setSize(int With ,int Height) | 标签大小设置 |
构造方法的实践例子:(图片文件在src路径里)
import javax.swing.*;
import java.awt.*;
import java.net.URL;
//JFrame父窗体类
class Parentform extends JFrame {
public Parentform(){
//为父类添加标题
super("JFrame父窗体的标题");
//窗体关闭规则
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
//窗体坐标,大小
setBounds(200,0,620,800);
//获取窗体容器
Container c = getContentPane();
//布局设置,使用流布局
c.setLayout(new FlowLayout());
JLabel no1 = new JLabel();
JLabel no2 = new JLabel("标签内容");
//获取图片的方法(方法1)
//获取当前类所在的路径
URL url = Demo.class.getResource("1.jpg");
//获取相应路径下的文件(图片)
Icon icon = new ImageIcon(url);
JLabel no3 = new JLabel(icon);
//获取图片的(方法2)
Icon icon2 = new ImageIcon("src/1.jpg");
JLabel no4 = new JLabel("显示图片",icon2, SwingConstants.LEFT);
//更改标签内容
no2.setText("更改标签内容");
//获取标签内容
System.out.println(no2.getText());
//在窗体显示图片路径
JLabel jl = new JLabel("获取图片路径:"+url.toString());
c.add(jl);
//自选打开
// c.add(no1);
// c.add(no2);
// c.add(no3);
c.add(no4);
//显示在后面或者刷新组件
//容器组件重新验证
c.validate();
//窗体显示
setVisible(true);
}
}
public class Demo {
public static void main(String[] args) {
new Parentform();
}
}
运行结果
注意:
java.lang.Class类中的 getResource()方法 可以获取资源文件的URL路径
图标使用
创建图标
创建图标使用到 java.awt.Graphics类 提供的功能来实现
在Swing中是通过Icon接口来实现创建图标,使用Icon接口必须实现以下3个方法:
修饰符、类型 | 方法 | 说明 |
---|---|---|
int | getIconHeight() | 获取图标高 |
int | getIconWidth() | 获取图标宽 |
void | paintIcon(Component c, Graphics g, int x, int y) | 指定坐标位置画图 |
import javax.swing.*;
import java.awt.*;
//JFrame父窗体类
class Parentform extends JFrame {
public Parentform(){
//为父类添加标题
super("JFrame父窗体的标题");
//窗体关闭规则
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
//窗体显示
setVisible(true);
//窗体坐标,大小
setBounds(300,230,300,200);
//获取窗体容器
Container c = getContentPane();
}
}
//绘图图标类
//引入Icon接口
class DrawIcon implements Icon{
// 声明图标的宽
private int W;
// 声明图标的高
private int H;
//获取数据
public DrawIcon(int W , int H){
this.W = W ;
this.H = H ;
}
// 实现paintIcon()方法
@Override
public void paintIcon(Component c, Graphics g, int x, int y) {
// 绘制一个圆形
g.fillOval(x , y , W , H);
}
@Override
public int getIconWidth() {
return this.W;
}
@Override
public int getIconHeight() {
return this.H;
}
}
public class Demo {
public static void main(String[] args) {
DrawIcon icon = new DrawIcon(23, 23);
// 创建一个标签,并设置标签上的文字在标签正中间
JLabel j = new JLabel("测试", icon, SwingConstants.CENTER);
Parentform jf = new Parentform();
jf.add(j);
}
}
运行结果
![](https://sanscan12.gitee.io/blogimg/Content/Java/Java06.png)
常用布局管理器
布局管理就是用于指定组件的摆放位置的。每种布局管理器都有自己的摆放风格。管理组件在容器中的位置和大小
需要该方法来定义窗体或面板布局
窗体或面板的对象.setLayout(布局类型);
绝对布局
绝对布局是指定组件在容器中的固定大小和位置
import javax.swing.*;
import java.awt.*;
//JFrame父窗体类
class Parentform extends JFrame {
public Parentform(){
//为父类添加标题
super("JFrame父窗体的标题");
//窗体关闭规则
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
//窗体显示
setVisible(true);
//窗体坐标,大小
setBounds(300,230,300,200);
//获取窗体容器
Container c = getContentPane();
//取消默认布局 , 更改为绝对布局
setLayout(null);
//创建按钮组件
JButton b1 = new JButton("按钮1") , b2 = new JButton("按钮2");
//给按钮组件添加坐标、大小
b1.setBounds(10,10,70,40);
b2.setBounds(112,64,92,60);
//添加按钮组件
c.add(b1);
c.add(b2);
}
}
public class Demo {
public static void main(String[] args) {
Parentform jf = new Parentform();
}
}
运行结果
注意:
绝对布局的窗口组件大小都是固定的,不随窗体大小更改而变化
组件坐标是以窗体左上角为基点的
FlowLayout 流布局
Class FlowLayout
java.lang.Object
java.awt.FlowLayout
流布局管理器 ,像流水一样从左到右摆放组件,直到占完所有空间,组件是默认居中排列
构造方法
FlowLayout()
FlowLayout(int alignment)
FlowLayout(int alignment , int horizGap , int vertGap)
alignment: 摆放方式
horizGap: 组件之间的水平间距
vertGap: 组件之间的垂直间距
alignment参数的摆放设置 | 说明 | 定义 |
---|---|---|
FlowLayout.LEFT | 左对齐排列 | 0 |
FlowLayout.CENTER | 居中排列 | 1 |
FlowLayout.RIGHT | 右对齐排列 | 2 |
horizGap : 组件与组件之间的水平间距(像素)
vertGap : 组件与组件之间的垂直间距(像素)
import javax.swing.*;
import java.awt.*;
//JFrame父窗体类
class Parentform extends JFrame {
public Parentform(){
//为父类添加标题
super("JFrame父窗体的标题");
//窗体关闭规则
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
//窗体坐标,大小
setBounds(300,230,300,200);
//获取窗体容器
Container c = getContentPane();
//流布局
//参数测试,自行选择
// setLayout(new FlowLayout());
// setLayout(new FlowLayout(0));//左对齐
// setLayout(new FlowLayout(1));//居中对齐(默认)
// setLayout(new FlowLayout(2));//右对齐
setLayout(new FlowLayout(1 , 20, 20));//居中对齐(默认)
//创建添加按钮组件
for (int i = 0; i < 10; i++) {
c.add(new JButton("按钮"+i));
}
//窗体显示
setVisible(true);
}
}
public class Demo {
public static void main(String[] args) {
new Parentform();
}
}
运行结果
![](https://sanscan12.gitee.io/blogimg/Content/Java/Java08.png)
BorderLayout 边界布局
Class BorderLayout
java.lang.Object
java.awt.BorderLayout
边界布局把容器的的布局分为五个位置:上下左右中5个区域 。设置该布局管理器是可无视,因默认是边界布局
在容器add()方法添加组件时可设置区域
成员变量 | 说明 |
---|---|
BorderLayout.NORTH | 顶端 |
BorderLayout.SOUTH | 底端 |
BorderLayout.EAST | 右端 |
BorderLayout.WEST | 左端 |
BorderLayout.CENTER | 中间 |
import javax.swing.*;
import java.awt.*;
//JFrame父窗体类