在 Swing 中,常见的按钮组件有 JButton、JCheckBox、JradioButton 等,它们都是抽象类 AbstractButton 类的直接或间接子类。在 AbstractButton 类中提供了按钮组件通用的一些方法,如下表所示。
| 方法描述 | 功能说明 |
|---|---|
| Icon getIcon()和 void seltIcon(Icon icon) | 设置或者获取按钮的图标 |
| String getText()和 void setText(String text) | 设置或者获取按钮的文本 |
| void setEnable(boolean b) | 启用(当 b 为 true)或禁用(当 b 为 false)按钮 |
| setSelected(boolean b) | 设置按钮的状态,当 b 为 true 时,按钮是选中状态,反之为未选中状态 |
| boolean isSelected() | 返回按钮的状态(true 为选中,反之为未选中) |
前面案例中已经多次用到 JButton 按钮,并且它的使用非常简单,这里就不介绍了。接下来主要围绕 JCheckBox 和 JRadioButton 这两个组件进行详细讲解。
1、JCheckBox
JCheckBox 组件被称为复选框,它有选中(是)/未选中(非)两种状态,如果用户想接收的输入只有“是”和“非”,则可以通过复选框来切换状态**。如果复选框有多个,则用户可以选其中的一个或多个。下表列举了创建 JCheckBox 对象的常用的构造方法。
| 方法描述 | 功能说明 |
|---|---|
| JCheckBox() | 创建一个没有文本信息,初始状态未被选中的复选框 |
| JCheckBox(String text) | 创建一个带有文本信息,初始状态未被选中的复选框 |
| JCheckBox(String text, boolean selected) | 创建一个带有文本信息,并指定初始状态(选中/未选中)的复选框 |
上表中列出了用于创建 JCheckBox 对象的 3 个构造方法。其中,第一个构造方法没有指定复选框的文本信息及状态,如果想设置文本信息,可以通过调用 JCheckBox 从父类继承的方法来进行设置之。例如调用 setText(String text)来设置复选框文本信息,调用 setSelected(boolean b)方法来设置复选框状态(是否被选中),也可以调用 isSelected()方法来判断复选框是否被选中。第 2 个和第 3 个构造方法都指定了复选框的文本信息,而且第 3 个构造方法还指定了复选框初始化状态是否被选中。
接下来通过一个案例来演示一下 JCheckBox 组件的用法,如下所示。
import java.awt.*;import java.awt.event.*;import java.security.spec.ECField;import javax.swing.*;public class example19 extends JFrame {private JCheckBox italic;private JCheckBox bold;private JLabel label;public example19() {//创建一个 JLabel 标签,标签文本居中对齐label = new JLabel("我爱你", JLabel.CENTER);//设置标签文本的字体label.setFont(new Font("宋体", Font.PLAIN, 20));this.add(label); //添加标签,默认添加到 CENTER 域JPanel panel = new JPanel(); //创建一个 JPanel 面板//创建两个 JCheckBox 复选框italic = new JCheckBox("ITALIC");bold = new JCheckBox("BOLD");//为复选框注册 ActionListener 监听器public void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubint mode = 0;if (bold.isSelected()) {mode += Font.BOLD;}if (italic.isSelected()) {mode += Font.ITALIC;}label.setFont(new Font("宋体", mode, 20));}};//为两个复选框添加监听器italic.addActionListener(listener);bold.addActionListener(listener);//在 JPanel 面板添加复选框panel.add(italic);panel.add(bold);//在 SOUTH 域添加 JPanel 面板this.add(panel, BorderLayout.SOUTH);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setSize(400, 300);this.setVisible(true);}public static void main(String[] args) {new example19();}}
运行程序,生成的窗口如下所示。
上述代码块中定义了一个 example19 类继承自 JFrame。该类中使用 BorderLayout 布局管理器将窗口分为两部分,其中,CENTER 区域放置了一个标签 label,用于显示普通样式的文本;SOUTH 区域放置了一个 JPanel 面板,在 JPanel 面板中放置了 bold 和 italic 两个复选框,并为这两个按钮注册监听事件,通过判断这两个按钮是否选中来改变界面字体的样式。
2、JRadioButton
JRadionButton 组件被称为单选组件,与 JCheckBox 复选框不同的是,单选按钮只能选中一个。就像随身听上的播放和快进按钮,当按下一个,先前按下的按钮就会自动弹起。对于 JRadioButton 按钮来说,当一个按钮被选中时,先前被选中的按钮就会自动取消选中。
由于 JRadionButton 组件本身并不具备这种功能,因此若想实现 JRadioButton 按钮之间的互斥,需要使用 javax.swing.ButtonGroup 类,它是一个**不可见的组件,不需要将其添加到容器中显示,只是在逻辑上表示一个单选按钮组。将多个 JRadioButton 按钮添加到同一个单选按钮组对象中(且必须),就能实现按钮的单选功能。**下表列举了创建 JRadioButton 对象常见的构造方法。
| 方法描述 | 功能说明 |
|---|---|
| JRadioButton() | 创建一个没有文本信息、初始状态未被选中的单选框 |
| JRadioButton(String text) | 创建一个带有文本信息、初始状态未被选定的单选框 |
| JRadioButton(String text, boolean selected) | 创建一个具有文本信息,并指定初始状态(选中/未选中)0 的单选框 |
接下来通过一个案例来演示 JRadioButton 组件的用法,如下所示。
import java.awt.*;import java.awt.event.*;import javax.swing.*;public class example20 extends JFrame {private ButtonGroup group; //单选按钮组对象private JPanel panel; //JPanel 面板用于放置三个 JRadioButton 按钮private JPanel pallet; //JPanel 面板作为调色板public example20() {pallet = new JPanel();this.add(pallet, BorderLayout.CENTER); //将调色板放置在 CENTER 域panel = new JPanel();group = new ButtonGroup();//调用 addJRadioButton()方法addJRadioButton("灰");addJRadioButton("粉");addJRadioButton("黄");this.add(panel, BorderLayout.SOUTH);this.setSize(300, 300);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setVisible(true);}/*** JRadioButton 按钮的文本信息 用于创建一个带有文本信息的 JRadioButton 按钮* 将按钮添加到 panel 面板和 ButtonGroup 中,并添加监听器*/private void addJRadioButton(final String text) {JRadioButton radioButton = new JRadioButton(text);group.add(radioButton);panel.add(radioButton);radioButton.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent arg0) {Color color = null;if ("灰".equals(text)) {color = Color.GRAY;} else if ("粉".equals(text)) {color = Color.PINK;} else if ("黄".equals(text)) {color = Color.YELLOW;} else {color = Color.WHITE;}pallet.setBackground(color);}});}public static void main(String[] args) {new example20();}}
运行程序,会生成一个窗体,单击“粉”单选框后,效果如下图所示。
上述代码块中定义了一个 example20 类继承自 JFrame。在 JRadioButtonDemo 中使用 BorderLayout 布局管理器将窗口分为两部分,其中,CENTER 区域放置了一个 JPanel 面板 pallet 作为调色板;SOUTH 区域也放置了一个 JPanel 面板 panel,在 panel 面板中添加了“灰”“粉”“黄”3 个 JRadioButton 按钮。当单击这 3 个不同的按钮时,pallet 面板的背景色就会相应的变成灰色、粉色或者黄色。
由于 3 个 JRadioButton 按钮都要添加到 panel 面板和 ButtonGroup 按钮组件中,当为它们添加事件监听时,会有很多重复的代码,因此可以把这些多重复的代码抽取到 addRadioButton()方法中,在该方法中将接收的 String 类型的参数 text 作为创建的 JRadioButton 按钮的文本信息。
33~47 行是为 JRadioButton 按钮添加事件监听器的代码,用来响应用户单击单选按钮的操作。在 actionPerformed()方法中,定义一个 Color 类型的变量 color,并根据方法传入的 text 值进行判断。若 text 为字符串 “灰”,则 color = Color.GRAY;若 text 为字符串 “粉”,则 color = Color.PINK;若 text 为字符串 “黄”,则 color = Color.YELLOW,否则 color = Color.WHITE。最后调用 pallet 的 setBackground(Color color)方法,根据参数 color 的值设置 pallet 的背景颜色。
