JAVA核心:Swing程序设计

文章目录

  • 1. Swing 概述
    • 1.1 Swing 特点
    • 1.2 Swing 包
    • 1.3 常用Swing组件概述
  • 2. 常用窗体
    • 2.1 JFrame窗体
    • 2.2 JDialog窗体(对话框窗体)
  • 3. 标签组件与图标
    • 3.1 标签的使用
    • 3.2 图标的使用
      • 3.2.1 创建图标
      • 3.2.2 使用图片图标
  • 4. 常用布局管理器
    • 4.1 绝对布局
    • 4.2 流布局管理器
    • 4.3 边界布局管理器
    • 4.4 网络布局管理器
    • 4.5 网格组布局管理器
  • 5. 常用面板
    • 5.1 JPanel面板
    • 5.2 滚动面板
  • 6. 按钮组件
    • 6.1 提交按钮组件
    • 6.2 单选按钮组件
    • 6.3 复选框
  • 7. 列表组件
    • 7.1 下拉列表框组件
      • 7.1.1 JComboBox类
      • 7.2.2 JComboBox模型
    • 7.2 列表框组件
  • 8. 文本组件
    • 8.1 文本框组件
    • 8.2 密码框组件
    • 8.3 文本域组件
  • 9. 常用监听事件
    • 9.1 监听事件简介
    • 9.2 动作事件监听器
    • 9.3 焦点事件监听器

1. Swing 概述

1.1 Swing 特点

原来的AWT组件来自java.awt包,当含有AWT组件的Java应用程序在不同的平台上执行时,每个平台的GUI组件的显示会有所不同,但是在不同平台上运行使用Swing开发的应用程序时,就可以统一GUI组件的显示风格,因为Swing组件允许编程人员在跨平台时指定统一的外观和风格。

JAVA核心:Swing程序设计_第1张图片
JAVA核心:Swing程序设计_第2张图片

1.2 Swing 包

为了有效地使用Swing组件,必须了解Swing包的层次结构和继承关系,其中比较重要的类是Component类、Container类和JComponent类。
JAVA核心:Swing程序设计_第3张图片
在Swing组件中最重要的父类是Container类,而Container类有两个最重要的子类,分别是java.awt.Windowjava.awt.Frame,除了以往的AWT类组件会继承这两个类之外,现在的Swing组件也扩展了这两个类。

1.3 常用Swing组件概述

JAVA核心:Swing程序设计_第4张图片
JAVA核心:Swing程序设计_第5张图片
JAVA核心:Swing程序设计_第6张图片
JAVA核心:Swing程序设计_第7张图片

2. 常用窗体

2.1 JFrame窗体

JFrame窗体是一个容器,它是Swing程序中各个组件的载体,可以将JFrame看作是承载这些Swing组件的容器。在开发应用程序时可以通过继承java.swing.JFrame类创建一个窗体,在这个窗口中添加组件,同时为组件设置事件。由于该窗体继承了JFrame类,所以它拥有一些最大化、最小化、关闭的按钮。

JFrame在程序中的语法格式如下:

JFrame jf = new JFrame(title);
Container container = jf.getContainerPane();
  • jf:JFrame类的对象。
  • container:Container类的对象,可以使用JFrame对象调用getContainerPane()方法获取。

Swing组件的窗体通常与组件和容器相关,所以在JFrame对象创建完成后,需要调用getContainerPane()方法将窗体转换为容器,然后在容器中添加组件或设置布局管理器。

例如:

container.add(new JButton("按钮"));
container.remove(new JButton("按钮"));

例子:

import java.awt.*;//导入awt包
import javax.swing.*;//导入swing包

public class Demo extends JFrame {
   // 定义一个类继承JFrame类

	public void CreateJFrame(String title) {
   // 定义一个CreateJFrame方法
		JFrame jf = new JFrame(title);// 实例化一个JFrame对象
		Container container = jf.getContentPane();// 获取一个容器
		JLabel jl = new JLabel("这是一个JFrame窗体");// 创建一个JLabel标签
		jl.setHorizontalAlignment(SwingConstants.CENTER);// 使标签上的文字居中

		container.add(jl);// 将标签添加到容器中
		container.setBackground(Color.white);// 设置容器的背景颜色
		jf.setVisible(true);// 使窗体可视
		jf.setSize(400, 300);// 设置窗体大小
		jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);// 设置窗体关闭方式

	}

	public static void main(String[] args) {
   // 在主方法中调用CreateJFrame()方法
		Demo demo = new Demo();
		demo.CreateJFrame("创建一个 JFrame窗体");
	}

}

运行结果:
JAVA核心:Swing程序设计_第8张图片

2.2 JDialog窗体(对话框窗体)

JDialog窗体的功能是从一个窗体中弹出另一个窗体,就像是在使用IE浏览器时弹出的确定对话框一样。JDialog窗体实质上就是另一种类型的窗体,它与JFrame窗体类似,JDialog窗体在使用时也需要调用getContentPane()方法将窗体转换为容器,然后在容器中设置窗体的特性。

通常,使用以下几个JDialog类的构造方法:

  • public JDialog():创建一个没有标题和父窗体的对话框。
  • public JDialog(Frame f):创建一个指定父窗体的对话框,但该窗体没有标题。
  • public JDialog(Frame f, boolean model):创建一个指类型的对话框,并指定父窗体,但该窗体没有指定标题。
  • public JDialog(Frame f, String model):创建一个指定标题和父窗口的对话框。
  • public JDialog(Frame f, String title, boolean model):创建一个指定标题、窗体和模式的对话框。

例子:

import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

public class Demo extends JDialog {
   
	public Demo(JFrame frame) {
   
		/*
		 * 第一个参数:父窗体对象 第二个参数:对话框标题 第三个参数:是否阻塞父窗体
		 */
		super(frame, "对话框标题", true);
		Container c = getContentPane();
		c.add(new JLabel("这是一个对话框"));

		setBounds(100, 100, 100, 100);
	}

	public static void main(String[] args) {
   
		JFrame f = new JFrame("父窗体");
		f.setBounds(50, 50, 300, 300);
		Container c = f.getContentPane();
		JButton btn = new JButton("弹出对话框");
		c.setLayout(new FlowLayout());
		c.add(btn);
		f.setVisible(true);
		f.setDefaultCloseOperation(EXIT_ON_CLOSE);

		btn.addActionListener(new ActionListener() {
   

			@Override
			public void actionPerformed(ActionEvent arg0) {
   
				Demo d = new Demo(f);
				d.setVisible(true);// 设置窗体可见

			}
		});// 添加动作监听

	}

}

运行结果:
JAVA核心:Swing程序设计_第9张图片

3. 标签组件与图标

在Swing中显示文本或提示信息的方式是使用标签,它支持文本字符串和图标。

3.1 标签的使用

标签由JLabel类定义,它的父类为JComponent类。

标签可以显示一行只读文本、一个图像或带图像的文本,它并不能产生任何类型的事件,只是简单地显示文本和图片,但是可以使用标签的特性指定标签上文本的对齐方式。

JLabel类提供了多种构造方法,这样可以创建多种标签,如显示只有文本的标签、只有图标的标签或是包含文本与图标的标签。

JLabel类常用的几个构造方法:

  • public JLabel():创建一个不带图标和文本的JLabel对象。
  • public JLabel(Icon icon):创建一个带图标的JLabel对象。
  • public JLabel(Icon icon, int aligment):创建一个带图标的JLabel对象,并设置图标水平对齐方式。
  • public JLabel(String text, int aligment):创建一个带文本的JLabel,并设置文字水平对齐方式。
  • public JLabel(String text, Icon icon, int aligment):创建一个带文本、带图标的JLabel对象,并设置标签内容的水平对齐方式。

例子:

import java.awt.Color;
import java.awt.Container;
import java.awt.Font;

import javax.swing.*;

public class Demo extends JFrame {
   
	public Demo() {
   
		setBounds(100, 100, 100, 100);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		Container c = getContentPane();
		setVisible(true);

		JLabel l = new JLabel("这是一个标签");
		l.setFont(new Font("楷体", Font.BOLD, 15));// 更改标签字体
		l.setForeground(Color.RED);// 更改字体颜色
//		l.setText("更改标签内容");
//		System.out.println(l.getText());
		c.add(l);

	}

	public static void main(String[] args) {
   
		new Demo();
	}

}

运行结果:
JAVA核心:Swing程序设计_第10张图片

3.2 图标的使用

Swing中的图标可以放置在按钮、标签等组件上,用于描述组件的用途。图标可以用Java支持的图片文件类型进行创建,也可以使用java.awt.Graphics类提供的功能方法来创建。

3.2.1 创建图标

在Swing中通过Icon接口来创建图标,可以在创建时给定图标的大小、颜色等特性。如果使用Icon接口,必须实现接口中的3个方法:

  • public int getIconHeight()
  • public int getIconWidth()
  • public void paintIcon(component arg(), Graphics arg1, int arg2, int arg3)

getIconHeight()getIconWidth()方法用于获取图标的长与宽,paintIcon()方法用于实现在指定坐标位置画图。

3.2.2 使用图片图标

Swing利用javax.swing.ImageIcon类根据现有图片创建图标,ImageIcon实现了Icon接口,同时java支持多种图片格式。

ImageIcon类有多个构造方法,下面是几个常用构造方法:

  • public ImageIcon():创建一个通用的ImageIcon对象,当真正需要设置图片时再使用ImageIcon对象调用setImage(Image image)方法来操作。
  • public ImageIcon(Image image):可以直接从图片源创建图标。
  • public ImageIcon(Image image, String description):除了可以从图片源创建图标之外,还可以为这个图标添加简短的描述,但这个描述不会在图标上显示,可以使用getDescription()方法获取这个描述。
  • public ImageIcon(URL url):利用位于计算机网络上的图像文件创建图标。

例子:

import java.awt.Container;
import java.net.URL;
import javax.swing.*;

public class Demo extends JFrame {
   
	public Demo() {
   
		setBounds(100, 100, 800, 350);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		Container c = getContentPane();

		JLabel l = new JLabel("这是一个展示图片的标签");
		URL url = Demo.class.getResource("vehicle.png");// 获取图片URL路径

		Icon icon = new ImageIcon(url);// 获取相应路径下的图片文件
		l.setIcon(icon);// 添加图片
		c.add(l);

		setVisible(true);

	}

	public static void main(String[] args) {
   
		new Demo();
	}

}

运行结果:
JAVA核心:Swing程序设计_第11张图片

4. 常用布局管理器

4.1 绝对布局

在Swing中,除了使用布局管理器之外也可以使用绝对布局。绝对布局,顾名思义,就是硬性指定组件在容器中的位置和大小,可以使用绝对坐标的方式来指定组件的位置。
JAVA核心:Swing程序设计_第12张图片
使用绝对布局的步骤如下:

(1)使用Container.setLayout(null)方法取消布局管理器。
(2)使用Component.setBounds()方法设置每个组件的大小与位置。

import java.awt.Container;
import javax.swing.*;

public class Demo extends JFrame {
   
	public Demo() {
   
		setBounds(100, 100, 200, 150);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		Container c = getContentPane();

		c.setLayout(null);// 将容器的布局设为绝对布局
		JButton bt1 = new JButton("按钮1"), bt2 = new JButton("按钮2");// 创建2个按钮
		bt1.setBounds(10, 30, 80, 30);// 设置按钮在容器中的坐标和大小
		bt2.setBounds(60, 70, 100, 20);
		c.add(bt1);
		c.add(bt2);

		setVisible(true);

	}

	public static void main(String[] args) {
   
		new Demo();
	}

}

运行结果:
JAVA核心:Swing程序设计_第13张图片

4.2 流布局管理器

流布局管理器是布局管理器中最基本的布局管理器。流布局管理器在整个容器中的布局正如其名,像“流”一样从左到右摆放组件,直到占据了这一行的所有空间,然后再向下移动一行。默认情况下,组件在每一行上都是居中排列的,但是通过设置也可以更改组件在每一行上的排列位置。
JAVA核心:Swing程序设计_第14张图片
FlowLayout类中具有以下常用的构造方法:

  • public FlowLayout()
  • public FlowLayout(int alignment)
  • public FlowLayout(int alignment,int horizGap,int vertGap)

构造方法中的alignment参数表示使用流布局管理器后组件在每一行的具体摆放位置。

import java.awt.Container;
import java.awt.FlowLayout;

import javax.swing.*;

public class Demo extends JFrame {
   
	public Demo() {
   
		setBounds(100, 100, 300, 200);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		Container c = getContentPane();

		c.setLayout(new FlowLayout(FlowLayout.LEFT,20,20));// 将容器的布局设置为流布局,设置为左对齐,间隔为20像素
		for(int i=0;i<10;i++) {
   
			c.add(new JButton("按钮"+i));//循环添加按钮组件
		}

		setVisible(true);

	}

	public static void main(String[] args) {
   
		new Demo();
	}

}

运行结果:
JAVA核心:Swing程序设计_第15张图片
通过拉伸对话框,可以得到:
JAVA核心:Swing程序设计_第16张图片

4.3 边界布局管理器

在默认不指定窗体布局的情况下,Swing组件的布局模式是BorderLayout布局管理器。边界布局管理器可以将容器划分为东、南、西、北、中5个区域,可以将组件加入到这5个区域中。容器调用Container类的add()方法添加组件时可以设置此组件在边界布局管理器中的区域,区域的控制可以由BorderLayout类中的成员变量来决定,这些成员变量的具体含义如下表所示。

JAVA核心:Swing程序设计_第17张图片
JAVA核心:Swing程序设计_第18张图片
例子:

import java.awt.BorderLayout;
import java.awt.Container;
import javax.swing.*;

public class Demo extends JFrame {
   
	public Demo() {
   
		setBounds(100, 100, 350, 200);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		Container c = getContentPane();

		c.setLayout(new BorderLayout());// 将容器的布局设置为边界布局
		JButton bt1 = new JButton("中"),
				bt2 = new JButton("东"), 
				bt3 = new JButton("西"),
				bt4 = new JButton("南"),
				bt5 = new JButton("北");

		c.add(bt1, BorderLayout.CENTER);// 中部添加按钮
		c.add(bt2, BorderLayout.EAST);// 东部添加按钮
		c.add(bt3, BorderLayout.WEST);// 西部添加按钮
		c.add(bt4, BorderLayout.SOUTH);// 南部添加按钮
		c.add(bt5, BorderLayout.NORTH);// 北部添加按钮

		setVisible(true);

	}

	public static void main(String[] args) {
   
		new Demo();
	}

}

运行结果:
JAVA核心:Swing程序设计_第19张图片

4.4 网络布局管理器

网格布局管理器将容器划分为网格,所以组件可以按行和列进行排列。在网格布局管理器中,每一个组件的大小都相同,并且网格中的空格的个数由网格的行数和列数决定,例如一个两行两列的网格能产生4个大小相等的网格。组件从网格的左上角开始,按照从左到右、从上到下的顺序加入到网格中,而且每一个组件都会填满整个网格,改变窗体的大小,组件也会随之而改变大小。

常用构造方法:

  • public GridLayout(int rows, int columns)
  • public GridLayout(int rows, int columns, int horizGap, int vertGap)

rowscolumns参数代表网格的行数和列数,两个参数只有一个可以为0,代表一行或一列可以排列任意多个组件;参数horizGapvertGap指定网格之间的距离,其中horizGap参数指定网格之间的水平距离,vertGap参数指定网格之间的垂直距离。

JAVA核心:Swing程序设计_第20张图片

import java.awt.Container;
import java.awt.GridLayout;

import javax.swing.*;

public class Demo extends JFrame {
   
	public Demo() {
   
		setBounds(100, 100, 300, 300);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		Container c = getContentPane();

		c.setLayout(new GridLayout(7, 3, 5, 5));// 将容器的布局设置为网格布局,7行3列,水平和垂直间距均为5像素

		for (int i = 0; i < 20; i++) {
   
			c.add(new JButton("按钮" + i));
		}

		setVisible(true);

	}

	public static void main(Strin

你可能感兴趣的:(JAVA,java,Swing)