【问题标题】:Returning result from the first clicked Jbutton from multiple JButtons java swing从多个JButtons java swing中返回第一个单击的Jbutton的结果
【发布时间】:2016-01-04 22:08:08
【问题描述】:

基本上我有 n 个 JButton。如果单击其中任何一个,它们将返回一个特定数字。 我有一个包含每个按钮的菜单,当用户单击一个时,我的菜单方法返回 Button 处理程序返回的数字。有可能吗?

类似:

frame.add(button1..)
frame.add(button2..)
frame.add(button3..)
if (button1.isClicked()) {
    return button1ActionHandler();
} else if (button2.isClicked()) {
       return button2ActionHandler();
} else if (button3.isClicked()) {
             return button3ActionHandler();
}

问题是,代码没有等我点击按钮,所以它不会输入任何 if's。如何让程序等待点击?如何检查按钮是否被点击?

【问题讨论】:

  • 澄清你所说的“带有每个按钮的菜单”的意思——我根本不清楚。否则你的问题是你试图在 事件驱动 编程环境中使用线性控制台类型编程。
  • 带有每个按钮的菜单基本上是......创建一个框架并向其添加按钮。你绝对是对的。我甚至是驱动程序编程的新手,我来自控制台编程,我发现很难想象它是如何工作的。
  • @Melye77 事件驱动编程其实比较简单,但是你需要对系统有一点信任,比如你需要信任那么当一个按钮(那个你注册了ActionListener to) 将调用您的ActionListener,当它以某种方式被激活时(点击并通过键盘)
  • 我确实相信它,但我想以不同的方式使用它。我只关心它是否被点击,因为我需要从一个函数到另一个函数解析一些结果。我的用户必须做出一个重要的选择,而这个特定的选择告诉了我很多信息。我的 actionListener 实际上不需要做太多事情:/ 只是为了在那里。我试着把它放在一段时间内,等待一个按钮被点击,但这只是将我的代码设置在一个无限循环中。我迷路了

标签: java swing jbutton


【解决方案1】:

首先查看How to Use Buttons, Check Boxes, and Radio ButtonsHow to Write an Action Listeners

请记住,GUI 是一个事件驱动的环境,也就是说,你可以响应它。

您需要为每个按钮注册一个ActionListener,当按钮被触发时,您需要采取适当的措施。

您可以通过多种方式实现此目的,您可以使用适当的信息设置按钮的actionCommand,您可以使用这些信息来确定单击按钮时应该执行的操作。您可以使用ActionEventsource 属性来确定事件的来源并采取适当的措施,例如

【讨论】:

  • 我需要我的菜单来返回单击的第一个按钮返回的任何内容。如果不将整个程序切换到单选按钮,我就无法做到这一点?
  • @Melye77:将按下的最后一个按钮的 actionCommand 存储在一个字段中,并在菜单代码中简单地查询该字段,但这听起来像是重复劳动。为什么不简单地在按钮的 ActionListener 中执行任何所需的命令并取消任何单独的菜单。 1+。 MP:很高兴您没有发布从 void 方法返回的代码。哎呀。
  • @HovercraftFullOfEels 现在还早,给我一个机会;)
【解决方案2】:

听起来您想向用户展示几个选项,让他选择其中一个选项,然后让他按“提交”按钮将该选项提交给程序。如果是这样,那么我认为您最好的选择是使用 JRadioButtons,所有这些都添加到一个 ButtonGroup 中——这允许在任何时候只选择一个单选按钮,或者使用 JComboBox。无论哪种方式,都可以轻松提取有关用户做出的选择的信息。如果您使用第一个选项,使用 JRadioButtons、ButtonGroup 和“提交”按钮,您只需通过调用 ButtonGroup 的getSelection() 方法从 ButtonGroup 中获取选定的 ButtonModel,然后通过调用 getActionCommand() 从该模型中提取 actionCommand 字符串.如果您决定使用第二个选项,将 JComboBox 与“提交”按钮一起使用,然后只需在提交按钮的 ActionListener 内的 JComboBox 上调用 getSelectedItem()

下面我将向您展示这两个选项。请注意,我的提交按钮不使用 ActionListener,而是使用 AbstractAction,这有点像类固醇上的 ActionListener。

import java.awt.event.ActionEvent;
import javax.swing.*;

public class SelectionEg extends JPanel {
    private static final String[] SELECTIONS = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday"};
    private ButtonGroup buttonGroup = new ButtonGroup(); 
    private JComboBox<String> selectionComboBox = new JComboBox<>(SELECTIONS);

    public SelectionEg() {
        for (String selection : SELECTIONS) {
            JRadioButton radioButton = new JRadioButton(selection);
            radioButton.setActionCommand(selection);
            add(radioButton);
            buttonGroup.add(radioButton);
        }
        add(selectionComboBox);
        add(new JButton(new SubmitAction("Submit")));        
    }

    private class SubmitAction extends AbstractAction {
        public SubmitAction(String name) {
            super(name);
            putValue(MNEMONIC_KEY, (int) name.charAt(0));
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            ButtonModel model = buttonGroup.getSelection();
            if (model == null) {
                // nothing selected yet, ignore this
                return;
            }
            String message = "The selected radio button is: " + model.getActionCommand();
            System.out.println(message);

            message = "The selection from the combo box is: " + selectionComboBox.getSelectedItem();
            System.out.println(message);
        }
    }

    private static void createAndShowGui() {
        JFrame frame = new JFrame("Selelection Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(new SelectionEg());
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGui();
            }
        });
    }
}

【讨论】:

    猜你喜欢
    • 2014-01-23
    • 2020-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多