文档

Java™ 教程
隐藏目录
如何使用按钮,复选框和单选按钮
路径:使用Swing创建GUI
课程:使用Swing组件
章节:如何使用各种组件

如何使用按钮、复选框和单选按钮

要创建一个按钮,您可以实例化从AbstractButton类继承的许多类之一。下表显示了您可能想使用的Swing定义的AbstractButton子类:

概要 描述位置
JButton 一个常见的按钮。 如何使用常见按钮API如何使用JButton功能
JCheckBox 一个复选框按钮。 如何使用复选框
JRadioButton 一组单选按钮之一。 如何使用单选按钮
JMenuItem 菜单中的项。 如何使用菜单
JCheckBoxMenuItem 具有复选框的菜单项。 如何使用菜单如何使用复选框
JRadioButtonMenuItem 具有单选按钮的菜单项。 如何使用菜单如何使用单选按钮
JToggleButton 实现JCheckBoxJRadioButton继承的切换功能。可以实例化或继承以创建两态按钮。 在一些示例中使用

注意: 如果您想将一组按钮集合成一行或一列,那么您应该查看工具栏

首先,本节介绍了AbstractButton定义的基本按钮API,因此所有的Swing按钮都具有这些API。接下来,它描述了JButtonAbstractButton添加的少量API。然后,本节将向您展示如何使用专门的API来实现复选框和单选按钮。

如何使用通用按钮API

下面是一个显示三个按钮的应用程序的图片:

ButtonDemo的快照

试一试: 
  1. 点击“启动”按钮以使用Java™ Web Start运行Button Demo(下载JDK 7或更高版本)。或者,如果要自己编译和运行示例,请参考示例索引启动ButtonDemo示例

  2. 点击左侧按钮。
    它会禁用中间按钮(以及它自己,因为它已经没有用了),并启用右侧按钮。
  3. 点击右侧按钮。
    它会启用中间按钮和左侧按钮,并禁用自己。

正如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功能

普通按钮 - JButton对象 - 比AbstractButton类提供的功能稍微多一点:你可以使一个JButton成为默认按钮。

在顶级容器中,最多只能有一个按钮是默认按钮。默认按钮通常具有突出的外观,并且当顶级容器具有键盘焦点且用户按下回车键时,它会被点击。下面是一个对话框的图片,实现在ListDialog示例中,其中的Set按钮是默认按钮:

在Java外观中,默认按钮具有粗边框

你可以通过在顶级容器的根窗格上调用setDefaultButton方法来设置默认按钮。下面是为ListDialog示例设置默认按钮的代码:

//在JDialog子类的构造函数中:
getRootPane().setDefaultButton(setButton);

默认按钮功能的具体实现取决于外观和感觉。例如,在Windows外观和感觉中,默认按钮会更改为具有焦点的按钮,这样按下回车键就会点击焦点按钮。当没有按钮获得焦点时,你最初指定的默认按钮会重新变为默认按钮。

如何使用复选框

JCheckBox类提供了对复选框按钮的支持。你还可以使用菜单中的JCheckBoxMenuItem类来放置复选框。因为JCheckBoxJCheckBoxMenuItem继承自AbstractButton,所以Swing复选框具有所有通常的按钮特性,正如本节前面讨论的那样。例如,你可以指定在复选框中使用的图像。

复选框与单选按钮类似,但它们的选择模型是不同的。按照约定,一组复选框中的任意数量的复选框 - 零个、一些或全部 - 可以被选择。而单选按钮组只能选择一个按钮。

下面是一个使用四个复选框来自定义卡通的应用程序的图片:

非教程读者!

请尝试以下操作: 
  1. 点击“启动”按钮以使用Java™ Web Start运行CheckBox Demo(下载JDK 7或更高版本)。或者,如果想自行编译和运行示例,请参考示例索引启动ButtonDemo示例

  2. 点击Chin按钮或按下Alt-c。
    Chin复选框将取消选中,并且图片中的下巴会消失。其他复选框保持选中状态。该应用程序具有一个项目侦听器,用于监听所有复选框的事件。每当项目侦听器接收到事件时,应用程序会加载一个反映复选框当前状态的新图片。

每次单击复选框,都会生成一个项目事件和一个动作事件。通常,只监听项目事件,因为它们能让您确定单击是选中还是取消选中复选框。下面是来自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版本支持使用JRadioButtonButtonGroup类创建单选按钮。要将单选按钮放置在菜单中,请使用JRadioButtonMenuItem类。其他显示多选一选择的方式包括下拉框列表。单选按钮的外观与复选框类似,但是根据惯例,复选框可以同时选择多个选项。

因为JRadioButton继承自AbstractButton,所以Swing单选按钮具有所有通常的按钮特性,正如本节前面讨论的那样。例如,您可以指定在单选按钮中显示的图像。

这是一个使用五个单选按钮的应用程序的图片,让您可以选择显示哪种宠物:

RadioButtonDemo的快照

请尝试以下操作: 
  1. 点击“启动”按钮以使用Java™ Web Start运行RadioButton演示(下载JDK 7或更高版本)。或者,要自己编译和运行示例,请参阅示例索引启动RadioButtonDemo示例

  2. 点击Dog按钮或按下Alt-d键。
    Dog按钮将变为选中状态,Bird按钮将变为未选中状态。图片从鸟变为狗。此应用程序有一个动作监听器,监听所有单选按钮的事件。每次动作监听器接收到事件时,应用程序都会显示刚刚点击的单选按钮对应的图片。

每当用户点击单选按钮(即使已经选中),按钮都会触发一个动作事件。还会发生一到两个项目事件,一个来自刚刚选中的按钮,另一个来自失去选中的按钮(如果有)。通常,您使用动作监听器来处理单选按钮的点击。

下面是从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

以下表格列出了常用的按钮相关的API。您可能会调用其他方法,比如setFontsetForeground,这些方法在JComponent类的API表格中列出。

使用按钮的API分为以下几个类别:

设置或获取按钮的内容JButton(Action)
JButton(String, Icon)
JButton(String)
JButton(Icon)
JButton()JButtonvoid setAction(Action)
Action getAction()
Actionvoid setText(String)
String getText()
在Swing组件中使用HTMLvoid setIcon(Icon)
Icon getIcon()
void setDisabledIcon(Icon)
Icon getDisabledIcon()
void setPressedIcon(Icon)
Icon getPressedIcon()
void setSelectedIcon(Icon)
Icon getSelectedIcon()
void setDisabledSelectedIcon(Icon)
Icon getDisabledSelectedIcon()
setRolloverEnabled(boolean)
boolean isRolloverEnabled()
void setRolloverIcon(Icon)
Icon getRolloverIcon()
void setRolloverSelectedIcon(Icon)
Icon getRolloverSelectedIcon()
setRolloverIcon(someIcon)setRolloverSelectedIconsetRollover(true)
调整按钮外观void setHorizontalAlignment(int)
void setVerticalAlignment(int)
int getHorizontalAlignment()
int getVerticalAlignment()AbstractButtonRIGHTLEFTCENTERLEADINGTRAILINGTOPCENTERBOTTOMvoid setHorizontalTextPosition(int)
void setVerticalTextPosition(int)
int getHorizontalTextPosition()
int getVerticalTextPosition()AbstractButtonLEFTCENTERRIGHTLEADINGTRAILINGTOPCENTERBOTTOMvoid setMargin(Insets)
Insets getMargin()void setFocusPainted(boolean)
boolean isFocusPainted()void setBorderPainted(boolean)
boolean isBorderPainted()void setIconTextGap(int)
int getIconTextGap()
实现按钮的功能void setMnemonic(int)
char getMnemonic()
setMnemonicintKeyEvent.VK_Xvoid setDisplayedMnemonicIndex(int)
int getDisplayedMnemonicIndex()
void setActionCommand(String)
String getActionCommand()
void addActionListener(ActionListener)
ActionListener removeActionListener()
void addItemListener(ItemListener)
ItemListener removeItemListener()
void setSelected(boolean)
boolean isSelected()
void doClick()
void doClick(int)
void setMultiClickThreshhold(long)
long getMultiClickThreshhold()
复选框构造函数
构造函数 目的
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,但具有两种状态。通常,您可以使用JRadioButtonJCheckBox而不是直接实例化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按钮组件的信息:


上一页: 如何制作 Applets
下一页: 如何使用 ButtonGroup 组件