当前位置: 首页 > 知识库问答 >
问题:

Swing:点击JRadiobutton

羊舌赞
2023-03-14

我想在按钮组中拦截对JRadioButton的点击。更准确地说:当选择JRadioButton A并且用户单击JRadioButton B时,我想显示一个Yes/No选项窗格。只有当用户单击“是”时,才会选择单选按钮B。如果用户单击“否”,则不应更改任何内容。这是不是或者说这是怎么可能的?

谢谢你抽出时间

共有2个答案

窦志新
2023-03-14

在B单选按钮中添加一个ItemListener。请参阅如何使用单选按钮。更改选择后,将调用侦听器。

如果选择了B按钮,则显示一个JOptionPane请求用户确认。请参阅如何制作对话框。按下ESC键或按下右上角的X按钮,也可以关闭作业窗格。

如果用户通过单击YES按钮来关闭作业窗格,我们什么也不做,因为按钮B实际上已经被选中。如果用户以任何其他方式关闭作业窗格,那么我们需要将选择重置为按钮A。

import java.awt.EventQueue;
import java.awt.event.ItemEvent;

import javax.swing.ButtonGroup;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButton;

public class Intercep {
    private JFrame frame;
    private JRadioButton aRadioButton;
    private JRadioButton bRadioButton;

    private void buildAndDisplayGui() {
        frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(createButtons());
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    private JPanel createButtons() {
        JPanel panel = new JPanel();
        ButtonGroup bg = new ButtonGroup();
        aRadioButton = new JRadioButton("A");
        bRadioButton = new JRadioButton("B");
        bRadioButton.addItemListener(this::handleItem);
        bg.add(aRadioButton);
        bg.add(bRadioButton);
        panel.add(aRadioButton);
        panel.add(bRadioButton);
        return panel;
    }

    private void handleItem(ItemEvent event) {
        if (event.getStateChange() == ItemEvent.SELECTED) {
            int result = JOptionPane.showConfirmDialog(frame,
                                                       "Are you sure?",
                                                       "Confirm",
                                                       JOptionPane.YES_NO_OPTION);
            switch (result) {
                case 0:
                    // YES
                    break;
                case -1:
                    // <ESC> or 'X'
                case 1:
                    // NO
                default:
                    aRadioButton.setSelected(true);
            }
            System.out.println("result = " + result);
        }
    }

    public static void main(String args[]) {
        EventQueue.invokeLater(() -> new Intercep().buildAndDisplayGui());
    }
}

请注意上面代码中的这一行:

bRadioButton.addItemListener(this::handleItem);

这称为方法参考。

岳朝
2023-03-14

您想要监听ItemEvents,以了解第一个按钮何时被选中(参见此)。您可以使用AbstractButton#isSelected检查是否选中了另一个按钮。最后,您可以使用JOptionPane#showConfirmDialog(Component,Object,String,int)提示用户“是”或“否”,并使用类似AbstractButton#setSelected(boolean)ButtonGroup#clearSelection的方法来控制选择哪些按钮。

这会让你从正确的方向开始。

 类似资料:
  • “点击劫持”攻击允许恶意页面 以用户的名义 点击“受害网站”。 许多网站都被黑客以这种方式攻击过,包括 Twitter、Facebook 和 Paypal 等许多网站。当然,它们都已经被修复了。 原理 原理十分简单。 我们以 Facebook 为例,解释点击劫持是如何完成的: 访问者被恶意页面吸引。怎样吸引的不重要。 页面上有一个看起来无害的链接(例如:“变得富有”或者“点我,超好玩!”)。 恶意

  • 描述 (Description) Parent selectors运算符有许多用途,例如,当您需要以默认的其他方式组合嵌套规则的选择器时。 &另一个典型用法是重复生成类名。 例子 (Example) 以下示例演示了在LESS文件中重复生成类名 - <html> <head> <link rel = "stylesheet" href = "style.css" type = "t

  • 使用SASS mixins集合,生成网格CSS,用于构建自己的语义网格。 行 grid-row() mixin用于创建行。 .container { @include grid-row; } 列 grid-column() mixin用于创建列。 可以用多种方式定义列的宽度。 .container { @include grid-column; //sets 100% colu

  • 描述 (Description) 可以使用其配置设置自定义插件。 例如,您可以设置accordion幻灯片的速度上下。 可以使用插件的DEFAULTS属性全局更改插件设置。 Foundation.Accordion.defaults.slideSpeed = 600; Foundation.Accordion.defaults.multiExpand = true; 通过更改HTML设置或Jav

  • 描述 (Description) 使用数据属性,插件连接到HTML元素,因为它们与插件的名称相匹配。 虽然大多数插件可以嵌套在其他插件中,但单个HTML元素一次只能有一个插件。 例如,工具提示链接是通过添加data-tooltip创建的。 例子 (Example) 以下示例演示如何使用将HTML元素连接到Foundation中的插件。 <html> <head> <title>J

  • 描述 (Description) 您可以使用ZIP下载,包管理器或CDN来获取Foundation JavaScript文件。 在您的代码中,您可以提供指向jQuery和Foundation的链接作为标记,放在结束之前,并检查在jQuery之后加载Foundation。 例子 (Example) 以下示例演示了在Foundation中使用JavaScript 。 <html> <head>