在 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 stub
int 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 的背景颜色。