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

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

ClassSummaryWhere Described
JButton通用按钮。如何使用通用按钮 API如何使用 JButton 功能
JCheckBox复选框按钮。如何使用复选框
JRadioButton一组单选按钮之一。如何使用单选按钮
JMenuItem菜单中的一项。如何使用菜单
JCheckBoxMenuItem带有复选框的菜单项。如何使用菜单如何使用复选框
JRadioButtonMenuItem具有单选按钮的菜单项。如何使用菜单如何使用单选按钮
JToggleButton实现JCheckBoxJRadioButton继承的切换功能。可以实例化或子类化以创建两个状态的按钮。用于某些examples

Note:

如果要将一组按钮收集到一行或一列中,则应签出tool bars

首先,本节说明AbstractButton定义的基本按钮 API,因此所有 Swing 按钮都具有相同之处。接下来,它描述了JButton添加到AbstractButton的少量 API。之后,本节将向您展示如何使用专门的 API 来实现复选框和单选按钮。

如何使用通用按钮 API

这是显示三个按钮的应用程序的图片:

ButtonDemo 的快照

Try this:

  • 单击启动按钮以使用Java™Web 开始(下载 JDK 7 或更高版本)运行按钮演示。另外,要自己编译和运行示例,请查阅example index

  • 单击左按钮。
    它禁用中间按钮(以及它本身,因为它不再有用了),并启用了右键。

  • 单击右键。
    它启用中键和左键,并禁用自身。

ButtonDemo示例所示,Swing 按钮可以同时显示文本和图像。在ButtonDemo中,每个按钮的文本相对于其图像均位于不同的位置。每个按钮文本中带下划线的字母显示每个按钮的* mnemonic *(替代键盘)。在大多数外观上,用户可以通过按 Alt 键和助记符来单击按钮。例如,Alt-M 将单击 ButtonDemo 中的“中间”按钮。

禁用按钮后,外观会自动生成按钮的禁用外观。但是,您可以提供一个图像来代替普通图像。例如,您可以提供左右按钮中使用的图像的灰色版本。

如何实现事件处理取决于您使用的按钮类型以及使用方式。通常,您实现action listener,每次用户单击按钮时都会收到通知。对于check boxes,您通常使用item listener,当选中或取消选中该复选框时会收到通知。

以下是来自ButtonDemo.java的代码,该代码在上一个示例中创建按钮并对按钮单击做出反应。粗体代码是如果按钮没有图像则将保留的代码。

//In initialization code:
    ImageIcon leftButtonIcon = createImageIcon("images/right.gif");
    ImageIcon middleButtonIcon = createImageIcon("images/middle.gif");
    ImageIcon rightButtonIcon = createImageIcon("images/left.gif");

    b1 = new JButton("Disable middle button", leftButtonIcon);
    b1.setVerticalTextPosition(AbstractButton.CENTER);
    b1.setHorizontalTextPosition(AbstractButton.LEADING); //aka LEFT, for left-to-right locales
    b1.setMnemonic(KeyEvent.VK_D);
    b1.setActionCommand("disable");

    b2 = new JButton("Middle button", middleButtonIcon);
    b2.setVerticalTextPosition(AbstractButton.BOTTOM);
    b2.setHorizontalTextPosition(AbstractButton.CENTER);
    b2.setMnemonic(KeyEvent.VK_M);

    b3 = new JButton("Enable middle button", rightButtonIcon);
    //Use the default text position of CENTER, TRAILING (RIGHT).
    b3.setMnemonic(KeyEvent.VK_E);
    b3.setActionCommand("enable");
    b3.setEnabled(false);

    //Listen for actions on buttons 1 and 3.
    b1.addActionListener(this);
    b3.addActionListener(this);

    b1.setToolTipText("Click this button to disable "
                      + "the middle button.");
    b2.setToolTipText("This middle button does nothing "
                      + "when you click it.");
    b3.setToolTipText("Click this button to enable the "
                      + "middle button.");
    ...
}

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);
    ...//error handling omitted for clarity...
    return new ImageIcon(imgURL);
}

如何使用 JButton 功能

普通按钮JButton对象比AbstractButton类提供的功能要多一点:您可以将JButton作为默认按钮。

顶级容器中最多有一个按钮可以是默认按钮。默认按钮通常具有突出显示的外观,并且只要顶级容器具有键盘焦点并且用户按下 Return 或 Enter 键,就会单击该按钮。这是一个在ListDialog示例中实现的对话框的图片,其中“设置”按钮是默认按钮:

在 Java Look&Feel 中,默认按钮带有粗边框

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

//In the constructor for a JDialog subclass:
getRootPane().setDefaultButton(setButton);

默认按钮功能的确切实现取决于外观。例如,在 Windows 外观中,默认按钮将更改为具有焦点的按钮,因此按 Enter 键将单击焦点按钮。当没有按钮成为焦点时,您最初指定为默认按钮的按钮将再次变为默认按钮。

如何使用复选框

JCheckBox类提供对复选框按钮的支持。您也可以使用JCheckBoxMenuItem类将复选框放在menus中。因为JCheckBoxJCheckBoxMenuItem继承自AbstractButton,所以 Swing 复选框具有所有通常的按钮 Feature,如本节前面所述。例如,您可以指定要在复选框中使用的图像。

复选框类似于radio buttons,但按照惯例,它们的选择模型不同。可以选择组中的任意数量的复选框-无,全部或全部。另一方面,一组单选按钮只能选择一个按钮。

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

不是教程 Reader!

Try this:

  • 单击启动按钮以使用Java™Web 开始(下载 JDK 7 或更高版本)运行 CheckBox 演示。另外,要自己编译和运行示例,请查阅example index

  • 单击 Chin 按钮或按 Alt-c。
    未选中“下巴”复选框,下巴从图片中消失。其他复选框保持选中状态。此应用程序具有一个项目侦听器,可侦听所有复选框。每次项侦听器收到事件时,应用程序都会加载一张新图片,以反映复选框的当前状态。

复选框会在每次点击时生成一个项目事件和一个操作事件。通常,您仅侦听项目事件,因为它们使您可以确定单击是选中还是取消选中了复选框。以下是来自CheckBoxDemo.java的代码,该代码创建上一个示例中的复选框并对点击做出反应。

//In initialization code:
    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);

    //Register a listener for the check boxes.
    chinButton.addItemListener(this);
    glassesButton.addItemListener(this);
    hairButton.addItemListener(this);
    teethButton.addItemListener(this);
...
public void itemStateChanged(ItemEvent e) {
    ...
    Object source = e.getItemSelectable();

    if (source == chinButton) {
        //...make a note of it...
    } else if (source == glassesButton) {
        //...make a note of it...
    } else if (source == hairButton) {
        //...make a note of it...
    } else if (source == teethButton) {
        //...make a note of it...
    }

    if (e.getStateChange() == ItemEvent.DESELECTED)
        //...make a note of it...
    ...
    updatePicture();
}

如何使用单选按钮

单选按钮是一组按钮,按照惯例,一次只能选择一个按钮。 Swing 版本支持JRadioButtonButtonGroup类的单选按钮。要将单选按钮放在menu中,请使用JRadioButtonMenuItem类。显示很多选择的其他方式是combo boxeslists。单选按钮看上去类似于check boxes,但是按照惯例,复选框对一次可以选择多少个项目没有限制。

因为JRadioButton继承自AbstractButton,所以 Swing 单选按钮具有所有通常的按钮 Feature,如本节前面所述。例如,您可以指定单选按钮中显示的图像。

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

RadioButtonDemo 的快照

Try this:

  • 单击启动按钮以使用Java™Web 开始(下载 JDK 7 或更高版本)运行 RadioButton 演示。另外,要自己编译和运行示例,请查阅example index

  • 单击“狗”按钮或按 Alt-d。
    “狗”按钮变为选中状态,从而使“鸟”按钮变为未选中状态。图片从鸟变成狗。该应用程序具有一个动作侦听器,可侦听所有单选按钮。每次动作侦听器收到事件时,应用程序都会显示刚刚单击的单选按钮的图片。

每次用户单击一个单选按钮(即使它已经被选中),该按钮都会触发action event。一或两个item events也会发生-一个来自刚刚选择的按钮,另一个来自丢失选择的按钮(如果有)。通常,您使用动作侦听器处理单选按钮的单击。

以下是来自RadioButtonDemo.java的代码,该代码在上一个示例中创建单选按钮并对点击做出反应。

//In initialization code:
    //Create the radio buttons.
    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);

    //Group the radio buttons.
    ButtonGroup group = new ButtonGroup();
    group.add(birdButton);
    group.add(catButton);
    group.add(dogButton);
    group.add(rabbitButton);
    group.add(pigButton);

    //Register a listener for the radio buttons.
    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 没有强制执行此规则-一组单选按钮不能进行初始选择。一旦用户做出选择,则从此开始仅选择一个按钮。

Button API

下表列出了常用的与按钮相关的 API。 JComponent 类的 API 表中列出了您可能调用的其他方法,例如setFontsetForeground

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

设置或获取按钮的内容

方法或构造函数Purpose
JButton(Action)

JButton(String, Icon)
JButton(String)
JButton(Icon)
JButton()
创建一个JButton实例,将其初始化为具有指定的文本/图像/动作。
void setAction(Action)
Action getAction()
根据Action实例中的值设置或获取按钮的属性。
void setText(String)
String getText()
设置或获取按钮显示的文本。您可以使用在 Swing 组件中使用 HTML中所述的 HTML 格式。
void 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)使光标移过该按钮时,该按钮显示指定的图标。 setRolloverSelectedIcon方法使您可以在选择按钮时指定过渡图标-这对于两种状态的按钮(例如切换按钮)很有用。设置翻转图标会自动调用setRollover(true),从而启用翻转。

微调按钮的外观

方法或构造函数Purpose
void setHorizontalAlignment(int)

void setVerticalAlignment(int)
int getHorizontalAlignment()
int getVerticalAlignment()
设置或获取其内容应在按钮中放置的位置。 AbstractButton类允许使用以下任一值进行水平对齐:RIGHTLEFTCENTER(默认值),LEADINGTRAILING。对于垂直对齐:TOPCENTER(默认值)和BOTTOM
void setHorizontalTextPosition(int)
void setVerticalTextPosition(int)
int getHorizontalTextPosition()
int getVerticalTextPosition()
设置或获取按钮文本相对于按钮图像的放置位置。 AbstractButton类允许使用以下任一水平值:LEFTCENTERRIGHTLEADINGTRAILING(默认值)。对于垂直位置:TOPCENTER(默认值)和BOTTOM
void setMargin(Insets)
Insets getMargin()
设置或获取按钮边框与其内容之间的像素数。
void setFocusPainted(boolean)
boolean isFocusPainted()
设置或获取按钮在具有焦点时是否应看起来不同。
void setBorderPainted(boolean)
boolean isBorderPainted()
设置或获取是否应绘制按钮的边框。
void setIconTextGap(int)
int getIconTextGap()
设置或获取此按钮上显示的文本和图标之间的间距。

实现按钮的功能

方法或构造函数Purpose
void setMnemonic(int)

char getMnemonic()
设置或获取键盘替代按钮的方法。 setMnemonic方法的一种形式接受字符参数。但是,Swing 团队建议您改用int参数,并指定KeyEvent.VK_X常量。
void 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()
设置或获取两次鼠标按下事件之间的时间(以毫秒为单位),以使按钮生成相应的动作事件。

复选框构造函数

ConstructorPurpose
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构造函数的参数方式相同,除了会显示除常规复选框图标之外的任何指定图标。

单选按钮构造函数

ConstructorPurpose
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构造函数的参数解释相同,除了会显示除常规单选按钮图标之外的任何指定图标。

切换按钮构造函数

ConstructorPurpose
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,则最初未选择切换按钮。

常用的按钮组构造函数/方法

构造函数或方法Purpose
ButtonGroup()创建一个ButtonGroup实例。
void add(AbstractButton)

void remove(AbstractButton)
向该组添加按钮,或从该组中删除按钮。
公共 ButtonGroup getGroup()
(在DefaultButtonModel中)
获取用于控制按钮的ButtonGroup(如果有)。例如:
ButtonGroup group = ((DefaultButtonModel)button.getModel()).getGroup();
公共 ButtonGroup clearSelection()清除 ButtonGroup 中选定按钮的状态。在 ButtonGroup 中没有选择任何按钮。

使用各种按钮的示例

以下示例使用按钮。另请参见使用工具栏的示例,其中列出了将JButton个对象添加到JToolBar的程序。

ExampleWhere DescribedNotes
ButtonDemo如何使用通用按钮 API使用助记符和图标。指定按钮文本相对于按钮图标的位置。使用动作命令。
ButtonHtmlDemo在 Swing 组件中使用 HTML一个 ButtonDemo 版本,其按钮中使用 HTML 格式。
ListDialog如何使用 JButton 功能实现一个带有两个按钮的对话框,其中一个是默认按钮。
DialogDemo如何制作对话框具有“显示它”按钮,其行为与单选按钮的状态有关。使用较大但内部匿名的类来实现动作侦听器。
ProgressBarDemo如何监控进度使用命名的内部类实现按钮的动作侦听器。
CheckBoxDemo如何使用复选框使用复选框按钮确定应显示 16 张图像中的哪张。
ActionDemo如何使用动作使用复选框菜单项设置程序的状态。
RadioButtonDemo如何使用单选按钮使用单选按钮确定应显示五个图像中的哪个。
DialogDemo如何制作对话框包含多组单选按钮,用于确定要弹出的对话框。
MenuDemo如何使用菜单包含单选按钮菜单项和复选框菜单项。
ColorChooserDemo2如何使用颜色 selectorsCrayonPanel中的蜡笔被实现为切换按钮。
ScrollDemo如何使用滚动窗格cm 按钮是一个切换按钮。

您可以从以下文档中了解有关 JavaFX 按钮组件的更多信息: