这些Java教程是为JDK 8编写的。本页中描述的示例和实践不利用后续版本中引入的改进,并可能使用不再可用的技术。
请参阅Java语言更改,了解Java SE 9及后续版本中更新的语言特性的概述。
请参阅JDK发行说明,了解所有JDK版本的新功能、增强功能以及已删除或不推荐的选项的信息。
要创建一个按钮,您可以实例化从AbstractButton类继承的许多类之一。下表显示了您可能想使用的Swing定义的AbstractButton子类:
| 类 | 概要 | 描述位置 |
|---|---|---|
JButton |
一个常见的按钮。 | 如何使用常见按钮API和如何使用JButton功能 |
JCheckBox |
一个复选框按钮。 | 如何使用复选框 |
JRadioButton |
一组单选按钮之一。 | 如何使用单选按钮 |
JMenuItem |
菜单中的项。 | 如何使用菜单 |
JCheckBoxMenuItem |
具有复选框的菜单项。 | 如何使用菜单和如何使用复选框 |
JRadioButtonMenuItem |
具有单选按钮的菜单项。 | 如何使用菜单和如何使用单选按钮 |
JToggleButton |
实现JCheckBox和JRadioButton继承的切换功能。可以实例化或继承以创建两态按钮。 |
在一些示例中使用 |
首先,本节介绍了AbstractButton定义的基本按钮API,因此所有的Swing按钮都具有这些API。接下来,它描述了JButton向AbstractButton添加的少量API。然后,本节将向您展示如何使用专门的API来实现复选框和单选按钮。
下面是一个显示三个按钮的应用程序的图片:
正如ButtonDemo示例所示,Swing按钮可以同时显示文本和图像。在ButtonDemo中,每个按钮的文本相对于其图像有不同的位置。每个按钮文本中的下划线字母显示了每个按钮的键盘替代键(即助记符)。在大多数外观中,用户可以通过按下Alt键和助记符来点击按钮。例如,在ButtonDemo中,Alt-M将点击中间按钮。
当按钮被禁用时,外观会自动生成按钮的禁用外观。但是,您可以提供一个替代普通图像的图像。例如,您可以提供灰色版本的左侧和右侧按钮使用的图像。
如何实现事件处理取决于您使用的按钮类型和使用方式。通常,您需要实现一个动作监听器,每当用户点击按钮时,该监听器就会被通知。对于复选框,通常会使用一个项目监听器,它在选中或取消选中复选框时被通知。
以下是来自ButtonDemo.java的代码,它创建了前面示例中的按钮并对按钮点击作出反应。加粗的代码是如果按钮没有图像时保留的代码。
//在初始化代码中:
ImageIcon leftButtonIcon = createImageIcon("images/right.gif");
ImageIcon middleButtonIcon = createImageIcon("images/middle.gif");
ImageIcon rightButtonIcon = createImageIcon("images/left.gif");
b1 = new JButton("禁用中间按钮", leftButtonIcon);
b1.setVerticalTextPosition(AbstractButton.CENTER);
b1.setHorizontalTextPosition(AbstractButton.LEADING); //对于从左到右的语言环境来说,也可以使用AbstractButton.LEFT
b1.setMnemonic(KeyEvent.VK_D);
b1.setActionCommand("disable");
b2 = new JButton("中间按钮", middleButtonIcon);
b2.setVerticalTextPosition(AbstractButton.BOTTOM);
b2.setHorizontalTextPosition(AbstractButton.CENTER);
b2.setMnemonic(KeyEvent.VK_M);
b3 = new JButton("启用中间按钮", rightButtonIcon);
//使用默认的文本位置:CENTER, TRAILING (RIGHT)
b3.setMnemonic(KeyEvent.VK_E);
b3.setActionCommand("enable");
b3.setEnabled(false);
//监听按钮1和按钮3的动作。
b1.addActionListener(this);
b3.addActionListener(this);
b1.setToolTipText("单击此按钮禁用中间按钮。");
b2.setToolTipText("单击此中间按钮时不会发生任何操作。");
b3.setToolTipText("单击此按钮启用中间按钮。");
...
}
public void actionPerformed(ActionEvent e) {
if ("disable".equals(e.getActionCommand())) {
b2.setEnabled(false);
b1.setEnabled(false);
b3.setEnabled(true);
} else {
b2.setEnabled(true);
b1.setEnabled(true);
b3.setEnabled(false);
}
}
protected static ImageIcon createImageIcon(String path) {
java.net.URL imgURL = ButtonDemo.class.getResource(path);
...//为了清晰起见,省略了错误处理...
return new ImageIcon(imgURL);
}
普通按钮 - JButton对象 - 比AbstractButton类提供的功能稍微多一点:你可以使一个JButton成为默认按钮。
在顶级容器中,最多只能有一个按钮是默认按钮。默认按钮通常具有突出的外观,并且当顶级容器具有键盘焦点且用户按下回车键时,它会被点击。下面是一个对话框的图片,实现在ListDialog示例中,其中的Set按钮是默认按钮:
你可以通过在顶级容器的根窗格上调用setDefaultButton方法来设置默认按钮。下面是为ListDialog示例设置默认按钮的代码:
//在JDialog子类的构造函数中: getRootPane().setDefaultButton(setButton);
默认按钮功能的具体实现取决于外观和感觉。例如,在Windows外观和感觉中,默认按钮会更改为具有焦点的按钮,这样按下回车键就会点击焦点按钮。当没有按钮获得焦点时,你最初指定的默认按钮会重新变为默认按钮。
JCheckBox类提供了对复选框按钮的支持。你还可以使用菜单中的JCheckBoxMenuItem类来放置复选框。因为JCheckBox和JCheckBoxMenuItem继承自AbstractButton,所以Swing复选框具有所有通常的按钮特性,正如本节前面讨论的那样。例如,你可以指定在复选框中使用的图像。
复选框与单选按钮类似,但它们的选择模型是不同的。按照约定,一组复选框中的任意数量的复选框 - 零个、一些或全部 - 可以被选择。而单选按钮组只能选择一个按钮。
下面是一个使用四个复选框来自定义卡通的应用程序的图片:
每次单击复选框,都会生成一个项目事件和一个动作事件。通常,只监听项目事件,因为它们能让您确定单击是选中还是取消选中复选框。下面是来自CheckBoxDemo.java的代码,该代码创建了前面示例中的复选框并响应单击事件。
//在初始化代码中:
chinButton = new JCheckBox("Chin");
chinButton.setMnemonic(KeyEvent.VK_C);
chinButton.setSelected(true);
glassesButton = new JCheckBox("Glasses");
glassesButton.setMnemonic(KeyEvent.VK_G);
glassesButton.setSelected(true);
hairButton = new JCheckBox("Hair");
hairButton.setMnemonic(KeyEvent.VK_H);
hairButton.setSelected(true);
teethButton = new JCheckBox("Teeth");
teethButton.setMnemonic(KeyEvent.VK_T);
teethButton.setSelected(true);
//为复选框注册侦听器。
chinButton.addItemListener(this);
glassesButton.addItemListener(this);
hairButton.addItemListener(this);
teethButton.addItemListener(this);
...
public void itemStateChanged(ItemEvent e) {
...
Object source = e.getItemSelectable();
if (source == chinButton) {
//...做一些处理...
} else if (source == glassesButton) {
//...做一些处理...
} else if (source == hairButton) {
//...做一些处理...
} else if (source == teethButton) {
//...做一些处理...
}
if (e.getStateChange() == ItemEvent.DESELECTED)
//...做一些处理...
...
updatePicture();
}
单选按钮是一组按钮,根据惯例,每次只能选择一个按钮。Swing版本支持使用JRadioButton和ButtonGroup类创建单选按钮。要将单选按钮放置在菜单中,请使用JRadioButtonMenuItem类。其他显示多选一选择的方式包括下拉框和列表。单选按钮的外观与复选框类似,但是根据惯例,复选框可以同时选择多个选项。
因为JRadioButton继承自AbstractButton,所以Swing单选按钮具有所有通常的按钮特性,正如本节前面讨论的那样。例如,您可以指定在单选按钮中显示的图像。
这是一个使用五个单选按钮的应用程序的图片,让您可以选择显示哪种宠物:
每当用户点击单选按钮(即使已经选中),按钮都会触发一个动作事件。还会发生一到两个项目事件,一个来自刚刚选中的按钮,另一个来自失去选中的按钮(如果有)。通常,您使用动作监听器来处理单选按钮的点击。
下面是从RadioButtonDemo.java中创建之前示例中的单选按钮并响应点击的代码。
//在初始化代码中:
//创建单选按钮。
JRadioButton birdButton = new JRadioButton(birdString);
birdButton.setMnemonic(KeyEvent.VK_B);
birdButton.setActionCommand(birdString);
birdButton.setSelected(true);
JRadioButton catButton = new JRadioButton(catString);
catButton.setMnemonic(KeyEvent.VK_C);
catButton.setActionCommand(catString);
JRadioButton dogButton = new JRadioButton(dogString);
dogButton.setMnemonic(KeyEvent.VK_D);
dogButton.setActionCommand(dogString);
JRadioButton rabbitButton = new JRadioButton(rabbitString);
rabbitButton.setMnemonic(KeyEvent.VK_R);
rabbitButton.setActionCommand(rabbitString);
JRadioButton pigButton = new JRadioButton(pigString);
pigButton.setMnemonic(KeyEvent.VK_P);
pigButton.setActionCommand(pigString);
//将单选按钮分组。
ButtonGroup group = new ButtonGroup();
group.add(birdButton);
group.add(catButton);
group.add(dogButton);
group.add(rabbitButton);
group.add(pigButton);
//为单选按钮注册监听器。
birdButton.addActionListener(this);
catButton.addActionListener(this);
dogButton.addActionListener(this);
rabbitButton.addActionListener(this);
pigButton.addActionListener(this);
...
public void actionPerformed(ActionEvent e) {
picture.setIcon(new ImageIcon("images/"
+ e.getActionCommand()
+ ".gif"));
}
对于每组单选按钮,您需要创建一个ButtonGroup实例,并将每个单选按钮添加到其中。当用户在组中选择另一个按钮时,ButtonGroup会取消选择先前选中的按钮。
通常应初始化一组单选按钮,以确保其中一个被选中。然而,API不强制执行此规则 - 一组单选按钮可以没有初始选择。一旦用户进行了选择,从那时起将只有一个按钮被选中。
以下表格列出了常用的按钮相关的API。您可能会调用其他方法,比如setFont和setForeground,这些方法在JComponent类的API表格中列出。
使用按钮的API分为以下几个类别:
设置或获取按钮的内容JButton(Action)JButtonvoid setAction(Action)
Actionvoid setText(String)
setRolloverIcon(someIcon)setRolloverSelectedIconsetRollover(true)
AbstractButtonRIGHTLEFTCENTERLEADINGTRAILINGTOPCENTERBOTTOMvoid setHorizontalTextPosition(int)
AbstractButtonLEFTCENTERRIGHTLEADINGTRAILINGTOPCENTERBOTTOMvoid setMargin(Insets)
setMnemonicintKeyEvent.VK_Xvoid setDisplayedMnemonicIndex(int)
| 构造函数 | 目的 |
|---|---|
| JCheckBox(Action) JCheckBox(String) JCheckBox(String, boolean) JCheckBox(Icon) JCheckBox(Icon, boolean) JCheckBox(String, Icon) JCheckBox(String, Icon, boolean) JCheckBox() |
创建一个JCheckBox实例。字符串参数指定复选框应显示的文本(如果有)。类似地,Icon参数指定应使用的图像,而不是外观的默认复选框图像。将布尔参数指定为true可初始化复选框为选中状态。如果布尔参数缺失或为false,则复选框最初为未选中状态。 |
| JCheckBoxMenuItem(Action) JCheckBoxMenuItem(String) JCheckBoxMenuItem(String, boolean) JCheckBoxMenuItem(Icon) JCheckBoxMenuItem(String, Icon) JCheckBoxMenuItem(String, Icon, boolean) JCheckBoxMenuItem() |
创建一个JCheckBoxMenuItem实例。参数的解释与JCheckBox构造函数的参数解释相同,只是任何指定的图标都会显示在正常复选框图标的旁边。 |
| 构造函数 | 目的 |
|---|---|
| JRadioButton(Action) JRadioButton(String) JRadioButton(String, boolean) JRadioButton(Icon) JRadioButton(Icon, boolean) JRadioButton(String, Icon) JRadioButton(String, Icon, boolean) JRadioButton() |
创建一个JRadioButton实例。字符串参数指定单选按钮应显示的文本(如果有)。类似地,Icon参数指定应使用的图像,而不是外观的默认单选按钮图像。如果将布尔参数指定为true,则初始化单选按钮为选中状态,但需要ButtonGroup对象的批准。如果布尔参数不存在或为false,则单选按钮最初为未选中状态。 |
| JRadioButtonMenuItem(Action) JRadioButtonMenuItem(String) JRadioButtonMenuItem(Icon) JRadioButtonMenuItem(String, Icon) JRadioButtonMenuItem() |
创建一个JRadioButtonMenuItem实例。这些参数的解释方式与JRadioButton构造函数的参数相同,只是除了普通的单选按钮图标外,还显示任何指定的图标。 |
| 构造方法 | 目的 |
|---|---|
| JToggleButton(Action) JToggleButton(String) JToggleButton(String, boolean) JToggleButton(Icon) JToggleButton(Icon, boolean) JToggleButton(String, Icon) JToggleButton(String, Icon, boolean) JToggleButton() |
创建一个JToggleButton实例,类似于JButton,但具有两种状态。通常,您可以使用JRadioButton或JCheckBox而不是直接实例化JToggleButton,但在不希望使用典型的单选按钮或复选框外观时,JToggleButton会很有用。字符串参数指定切换按钮应显示的文本(如果有)。类似地,Icon参数指定应使用的图像。将布尔参数设置为true会将切换按钮初始化为已选择。如果布尔参数不存在或为false,则切换按钮最初未选择。 |
| 构造函数或方法 | 用途 |
|---|---|
| ButtonGroup() | 创建一个ButtonGroup实例。 |
| void add(AbstractButton) void remove(AbstractButton) |
向组中添加按钮,或从组中移除按钮。 |
| public ButtonGroup getGroup() (在 DefaultButtonModel中) |
获取控制按钮的ButtonGroup(如果有的话)。例如:ButtonGroup group = ((DefaultButtonModel)button.getModel()).getGroup(); |
| public ButtonGroup clearSelection() | 清除按钮组中选定按钮的状态。按钮组中的按钮均不被选中。 |
以下示例使用按钮。还可以参见使用工具栏的示例,该示例列出了向JToolBar添加JButton对象的程序。
ButtonDemo如何使用常见按钮APIButtonHtmlDemo在Swing组件中使用HTMLListDialog如何使用JButton功能DialogDemo如何创建对话框ProgressBarDemo如何监控进度CheckBoxDemo如何使用复选框ActionDemo如何使用动作RadioButtonDemo如何使用单选按钮DialogDemo如何创建对话框MenuDemo如何使用菜单ColorChooserDemo2如何使用颜色选择器CrayonPanelScrollDemo如何使用滚动窗格cm
你可以从以下文档中了解更多关于JavaFX按钮组件的信息: