按钮组件

在 Swing 程序设计中,按钮是较为常见的组件,用于触发特定的动作。Swing 提供了多种按钮组件:按钮、单选按钮、复选框等。本节将分别对这些按钮组件进行讲解。

JButton按钮

Swing 按钮由 JButton 对象表示,JButton 常用的构造方法如下。

  • public JButton():创建一个不带文本或图标的按钮。

  • public JButton(String text):创建一个带文本的按钮。

  • public JButton(Icon icon):创建一个带图标的按钮。

  • public JButton(String text, Icon icon):创建一个带文本和图标的按钮。

创建 JButton 对象后,如果要对 JButton 对象进行设置,则需要使用 JButton 类提供的方法。JButton 类的常用方法及其说明如表18.6所示。

image 2024 03 05 22 26 03 482
Figure 1. 表18.6 JButton类的常用方法及其说明

【例18.15】演示不同效果的按钮(实例位置:资源包\TM\sl\18\15)

创建 JButtonTest 类,并继承 JFrame 类,在窗体中创建按钮组件,设置按钮的图标,为按钮添加动作监听器。

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

public class JButtonTest extends JFrame {
	public JButtonTest() {
		Icon icon = new ImageIcon("src/imageButtoo.jpg"); // 获取图片文件
		setLayout(new GridLayout(3, 2, 5, 5)); // 设置网格布局管理器
		Container c = getContentPane(); // 获取主容器
		JButton btn[] = new JButton[6]; // 创建按钮数组
		for (int i = 0; i < btn.length; i++) {
			btn[i] = new JButton(); // 实例化数组中的对象
			c.add(btn[i]); // 将按钮添加到容器中
		}
		btn[0].setText("不可用");
		btn[0].setEnabled(false); // 设置按钮不可用
		btn[1].setText("有背景色");
		btn[1].setBackground(Color.YELLOW);
		btn[2].setText("无边框");
		btn[2].setBorderPainted(false); // 设置按钮边框不显示
		btn[3].setText("有边框");
		btn[3].setBorder(BorderFactory.createLineBorder(Color.RED)); // 添加红色线型边框
		btn[4].setIcon(icon); // 为按钮设置图标
		btn[4].setToolTipText("图片按钮"); // 设置鼠标悬停时提示的文字
		btn[5].setText("可点击");
		btn[5].addActionListener(new ActionListener() { // 为按钮添加监听事件
			public void actionPerformed(ActionEvent e) {
				JOptionPane.showMessageDialog(JButtonTest.this, "点击按钮"); // 弹出确认对话框
			}
		});
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setVisible(true);
		setTitle("创建不同样式的按钮");
		setBounds(100, 100, 400, 200);
	}

	public static void main(String[] args) {
		new JButtonTest();
	}
}
image 2024 03 05 22 27 50 512
Figure 2. 图18.20 按钮组件的应用

JRadioButton单选按钮

Swing 单选按钮由 JRadioButton 对象表示。在 Swing 程序设计中,需要把多个单选按钮添加到按钮组中,当用户选中某个单选按钮时,按钮组中的其他单选按钮将不能被同时选中。

单选按钮

创建 JRadioButton 对象需要使用 JRadioButton 类的构造方法。JRadioButton 类常用的构造方法如下。

  • public JRadioButton():创建一个未被选中、文本未被设定的单选按钮。

  • public JRadioButton(Icon icon):创建一个未被选中、文本未被设定,但具有指定图标的单选按钮。

  • public JRadioButton(Icon icon, boolean selected):创建一个具有指定图标、选择状态,但文本未被设定的单选按钮。

  • public JRadioButton(String text):创建一个具有指定文本,但未被选中的单选按钮。

  • public JRadioButton(String text, Icon icon):创建一个具有指定文本、指定图标,但未被选中的单选按钮。

  • public JRadioButton(String text, Icon icon, boolean selected):创建一个具有指定的文本、指定图标和选择状态的单选按钮。

根据上述构造方法的相关介绍,不难发现,单选按钮的图标、文本和选择状态等属性能够被同时设定。例如,使用 JRadioButton 类的构造方法创建一个文本为 “选项A” 的单选按钮,关键代码如下:

JRadioButton rbtn = new JRadioButton("选项A");

按钮组

Swing 按钮组由 ButtonGroup 对象表示,多个单选按钮被添加到按钮组中后,能够实现 “选项有多个,但只能选中一个” 的效果。ButtonGroup 对象被创建后,可以使用 add() 方法把多个单选按钮添加到 ButtonGroup 对象中。例如,在应用程序窗体中定义一个单选按钮组,代码如下:

JRadioButton jr1 = new JRadioButton();
JRadioButton jr2 = new JRadioButton();
JRadioButton jr3 = new JRadioButton();
ButtonGroup group = new ButtonGroup();
group.add(jr1);
group.add(jr2);
group.add(jr3);

【例18.16】性别选择(实例位置:资源包\TM\sl\18\16)

创建 RadioButtonTest 类,并继承 JFrame 类,窗体中有男女两种性别可以供用户选择,但只能选择其中一种性别。

import javax.swing.*;

public class RadioButtonTest extends JFrame {
	public RadioButtonTest() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setTitle("单选按钮的使用");
		setBounds(100, 100, 240, 120);
		getContentPane().setLayout(null); // 设置绝对布局
		JLabel lblNewLabel = new JLabel("请选择性别:");
		lblNewLabel.setBounds(5, 5, 120, 15);
		getContentPane().add(lblNewLabel);
		JRadioButton rbtnNormal = new JRadioButton("男");
		rbtnNormal.setSelected(true);
		rbtnNormal.setBounds(40, 30, 75, 22);
		getContentPane().add(rbtnNormal);
		JRadioButton rbtnPwd = new JRadioButton("女");
		rbtnPwd.setBounds(120, 30, 75, 22);
		getContentPane().add(rbtnPwd);
		// 创建按钮组,把交互面板中的单选按钮添加到按钮组中
		ButtonGroup group = new ButtonGroup();
		group.add(rbtnNormal);
		group.add(rbtnPwd);
	}

	public static void main(String[] args) {
		RadioButtonTest frame = new RadioButtonTest(); // 创建窗体对象
		frame.setVisible(true); // 使窗体可见
	}
}

运行结果如图18.21所示,当选中某一个单选按钮时,另一个单选按钮会被取消选中状态。

image 2024 03 05 22 47 05 886
Figure 3. 图18.21 单选按钮组件的使用

JCheckBox复选框

复选框组件由 JCheckBox 对象表示。与单选按钮不同的是,窗体中的复选框可以被选中多个,这是因为每一个复选框都提供 “被选中” 和 “不被选中” 两种状态。JCheckBox 的常用构造方法如下。

  • public JCheckBox():创建一个文本、图标未被设定且默认未被选中的复选框。

  • public JCheckBox(Icon icon, Boolean checked):创建一个具有指定图标、指定初始时是否被选中,但文本未被设定的复选框。

  • public JCheckBox(String text, Boolean checked):创建一个具有指定文本、指定初始时是否被选中,但图标未被设定的复选框。

【例18.17】输出用户的所选内容(实例位置:资源包\TM\sl\18\17)

创建 CheckBoxTest 类,并继承 JFrame 类,窗体中有 3 个复选框按钮和一个普通按钮,当单击普通按钮时,在控制台中分别输出 3 个复选框的选中状态。

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

import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;

public class CheckBoxTest extends JFrame {
	public CheckBoxTest() {
		setBounds(100, 100, 170, 110); // 窗口坐标和大小
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		Container c = getContentPane(); // 获取主容器
		c.setLayout(new FlowLayout()); // 容器使用流布局
		JCheckBox c1 = new JCheckBox("1"); // 创建复选框
		JCheckBox c2 = new JCheckBox("2");
		JCheckBox c3 = new JCheckBox("3");
		c.add(c1); // 容器添加复选框
		c.add(c2);
		c.add(c3);
		JButton btn = new JButton("打印"); // 创建打印按钮
		btn.addActionListener(new ActionListener() { // 打印按钮动作事件
			public void actionPerformed(ActionEvent e) {
				// 在控制台分别输出三个复选框的选中状态
				System.out.println(c1.getText() + "按钮选中状态:" + c1.isSelected());
				System.out.println(c2.getText() + "按钮选中状态:" + c2.isSelected());
				System.out.println(c3.getText() + "按钮选中状态:" + c3.isSelected());
			}
		});
		c.add(btn); // 容器添加打印按钮
		setVisible(true);
	}

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

选中第1、3个复选框后,运行结果如图18.22所示。

image 2024 03 05 22 50 24 168
Figure 4. 图18.22 复选框组件的使用

编程训练(答案位置:资源包\TM\sl\18\编程训练)

【训练9】模拟交通信号灯 使用图标和单选按钮模拟交通红绿灯,其中绿灯对应的单选按钮被默认选中。

【训练10】ASCII编码查看器 编写一个十进制的ASCII编码查看器,可以将字符转换成数字,也可以反向转换它们。