【问题标题】:Checkbox to change button actionlistener用于更改按钮操作侦听器的复选框
【发布时间】:2016-06-01 05:49:00
【问题描述】:

我正在尝试在一个小程序中制作,我创造了一个复选框时,为特定按钮执行的操作更改为执行的另一个操作,假设所执行的按钮操作给出了1+的结果2,我希望当我选中复选框时,例如使执行的按钮动作为1-3。

这是我的代码

import java.awt.*;

public class frame extends JFrame { // Declaring the frame class

public frame() { // crating a constructor 
    getContentPane().setLayout(new GridLayout(5,2)); // Creating 5 lines and 2 rows
    // first label for adding the first number
    JLabel label = new JLabel("First Number");
    getContentPane().add(label);
    label.setHorizontalAlignment(SwingConstants.CENTER);
    // first text field
    final JTextField text = new JTextField(8);
    getContentPane().add(text);
    text.setHorizontalAlignment(SwingConstants.CENTER);
    // second label for adding second number
    JLabel label1 = new JLabel("Second Number");
    getContentPane().add(label1);
    label1.setHorizontalAlignment(SwingConstants.CENTER);
    // second text field
    final JTextField text1 = new JTextField();
    getContentPane().add(text1);
    text1.setHorizontalAlignment(SwingConstants.CENTER);
    // third label for the result
    JLabel label2 = new JLabel("Result is");
    getContentPane().add(label2);
    label2.setHorizontalAlignment(SwingConstants.CENTER);
    // third text field to show the result
    final JTextField text2 = new JTextField();
    getContentPane().add(text2);
    text2.setHorizontalAlignment(SwingConstants.CENTER);
    text2.setEditable(false);
    // Calculation button
    JButton btn = new JButton("Calculate");
    btn.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            String number1, number2, result, ans;
            try {
                /*number1 = Double.parseDouble(text.getText());
                number2 = Double.parseDouble(text1.getText());
                result = number1*number2;
                text2.setText(Double.toString(result));*/
                if (text.getText().isEmpty() || text1.getText().isEmpty()) {
                    throw new Exception();
                }

                number1 = text.getText();
                number2 = text1.getText();
                result = number1.concat(number2);
                text2.toString();
                text2.setText(result);

            } catch (Exception e1) {
                JOptionPane.showMessageDialog(null, "Please add a letter");
            }
        }
    });     
    getContentPane().add(btn);
    // Clear button
    JButton clear = new JButton("Clear");
    getContentPane().add(clear);

    final JCheckBox chckbxNewCheckBox = new JCheckBox("New check box");
    getContentPane().add(chckbxNewCheckBox);

    final JCheckBox chckbxNewCheckBox_1 = new JCheckBox("New check box");
    getContentPane().add(chckbxNewCheckBox_1);

    chckbxNewCheckBox.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            if (chckbxNewCheckBox.isSelected()) {
                chckbxNewCheckBox_1.setSelected(false);
            }
        }
    });

    chckbxNewCheckBox_1.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            if (chckbxNewCheckBox_1.isSelected()) {
                chckbxNewCheckBox.setSelected(false);
            }
        }
    });

    clear.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            try {
                text.setText("");
                text1.setText("");
                text2.setText("");
            } catch(Exception e1) {
            }
        }
    });

    //setVisible(true);
    //setSize(400,200);
    //setResizable(false);
    //setLocationRelativeTo(null);
    //setTitle("Calculator");
}

public static void main (String args[]) { // Creating the main method
    frame frame = new frame(); // creating an object of the ShowGridLayout class, object is frame.
    frame.setVisible(true);
    frame.setSize(400, 200);
    frame.setResizable(false);
    frame.setLocationRelativeTo(null);
    frame.setTitle("Calculator");
    frame.setDefaultCloseOperation(EXIT_ON_CLOSE);;
}

}

【问题讨论】:

    标签: java swing checkbox radio-button


    【解决方案1】:

    可以通过多种方式解决。

    1. 您可以拥有一个整数字段(成员变量或静态)并在选择不同复选框时更新它的值。为您要执行的每种操作定义不同的方法,并通过查看静态整数的值在按钮操作侦听器中调用它们。

    1. 保留对添加到按钮的 ActionListener 的引用,并在选中复选框时从按钮中删除现有的操作侦听器并添加新的操作侦听器并更新对新侦听器的引用。

    希望对你有帮助。

    编辑 1:如果您只想一次选择一个选项,最好使用单选按钮。

    编辑 2: 这是使用单选按钮以及删除和添加侦听器的方法。

        public class frame extends JFrame { // Declaring the frame class
            final JTextField text;
            final JTextField text1;
            final JTextField text2;
    
            public frame() { // crating a constructor
                getContentPane().setLayout(new GridLayout(5, 2)); // Creating 5 lines and 2 rows
                // first label for adding the first number
                JLabel label = new JLabel("First Number");
                getContentPane().add(label);
                label.setHorizontalAlignment(SwingConstants.CENTER);
                // first text field
                text = new JTextField(8);
                getContentPane().add(text);
                text.setHorizontalAlignment(SwingConstants.CENTER);
                // second label for adding second number
                JLabel label1 = new JLabel("Second Number");
                getContentPane().add(label1);
                label1.setHorizontalAlignment(SwingConstants.CENTER);
                // second text field
                text1 = new JTextField();
                getContentPane().add(text1);
                text1.setHorizontalAlignment(SwingConstants.CENTER);
                // third label for the result
                JLabel label2 = new JLabel("Result is");
                getContentPane().add(label2);
                label2.setHorizontalAlignment(SwingConstants.CENTER);
                // third text field to show the result
                text2 = new JTextField();
                getContentPane().add(text2);
                text2.setHorizontalAlignment(SwingConstants.CENTER);
                text2.setEditable(false);
    
                final AddValuesActionListener actionListener = new AddValuesActionListener();
                // Calculation button
                final JButton btn = new JButton("Calculate");
                btn.addActionListener(actionListener);
    
                final JRadioButton addRadioButton = new JRadioButton("Add", true);
                addRadioButton.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        btn.removeActionListener(actionListener);
                        btn.addActionListener(new AddValuesActionListener());
                    }
                });
    
                final JRadioButton subtractRadioButton = new JRadioButton("Subtract", true);
                subtractRadioButton.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        btn.removeActionListener(actionListener);
                        btn.addActionListener(new SubtractValuesActionListener());
                    }
                });
    
    
                getContentPane().add(btn);
                // Clear button
                JButton clear = new JButton("Clear");
                getContentPane().add(clear);
    
                ButtonGroup radioButtons = new ButtonGroup();
                radioButtons.add(addRadioButton);
                radioButtons.add(subtractRadioButton);
                getContentPane().add(addRadioButton);
                getContentPane().add(subtractRadioButton);
            }
    
            public static void main(String args[]) { // Creating the main method
                frame frame = new frame(); // creating an object of the ShowGridLayout class, object is frame.
                frame.setVisible(true);
                frame.setSize(400, 200);
                frame.setResizable(false);
                frame.setLocationRelativeTo(null);
                frame.setTitle("Calculator");
                frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
                ;
            }
    
            private class AddValuesActionListener implements ActionListener {
                public void actionPerformed(ActionEvent e) {
                    text2.setText(text.getText() + "+" + text1.getText());  //Create add values method
                }
            }
    
            private class SubtractValuesActionListener implements ActionListener {
                public void actionPerformed(ActionEvent e) {
                    text2.setText(text.getText() + "-" + text1.getText());  //Create add values method
                }
            }
        }
    

    您可以按照@JeriesHG 的建议通过检查单选按钮选择来简单地做到这一点

        public class frame extends JFrame { // Declaring the frame class
            final JTextField text;
            final JTextField text1;
            final JTextField text2;
    
            public frame() { // crating a constructor
                getContentPane().setLayout(new GridLayout(5, 2)); // Creating 5 lines and 2 rows
                // first label for adding the first number
                JLabel label = new JLabel("First Number");
                getContentPane().add(label);
                label.setHorizontalAlignment(SwingConstants.CENTER);
                // first text field
                text = new JTextField(8);
                getContentPane().add(text);
                text.setHorizontalAlignment(SwingConstants.CENTER);
                // second label for adding second number
                JLabel label1 = new JLabel("Second Number");
                getContentPane().add(label1);
                label1.setHorizontalAlignment(SwingConstants.CENTER);
                // second text field
                text1 = new JTextField();
                getContentPane().add(text1);
                text1.setHorizontalAlignment(SwingConstants.CENTER);
                // third label for the result
                JLabel label2 = new JLabel("Result is");
                getContentPane().add(label2);
                label2.setHorizontalAlignment(SwingConstants.CENTER);
                // third text field to show the result
                text2 = new JTextField();
                getContentPane().add(text2);
                text2.setHorizontalAlignment(SwingConstants.CENTER);
                text2.setEditable(false);
    
                final JRadioButton addRadioButton = new JRadioButton("Add", true);
                final JRadioButton subtractRadioButton = new JRadioButton("Subtract", true);
    
                // Calculation button
                final JButton btn = new JButton("Calculate");
                btn.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                      if (addRadioButton.isSelected()) {
                          text2.setText(text.getText() + "+" + text1.getText());  //Create add values method
                      }     else if (subtractRadioButton.isSelected()) {
                          text2.setText(text.getText() + "-" + text1.getText());  //Create subtract values method
                      }
                    }
                });
    
                getContentPane().add(btn);
                // Clear button
                JButton clear = new JButton("Clear");
                getContentPane().add(clear);
    
                ButtonGroup radioButtons = new ButtonGroup();
                radioButtons.add(addRadioButton);
                radioButtons.add(subtractRadioButton);
                getContentPane().add(addRadioButton);
                getContentPane().add(subtractRadioButton);
            }
    
            public static void main(String args[]) { // Creating the main method
                frame frame = new frame(); // creating an object of the ShowGridLayout class, object is frame.
                frame.setVisible(true);
                frame.setSize(400, 200);
                frame.setResizable(false);
                frame.setLocationRelativeTo(null);
                frame.setTitle("Calculator");
                frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
                ;
            }
    
        }
    

    【讨论】:

    • @Parkash Jat 你能给我一个关于第二个选项的例子吗,我没有看到例子就明白了:)
    • 我已经编辑了我的回复,并附有我和@JeriesHG 建议的示例代码
    • Thaaaaaaaaaaaaank 你这么多,我会检查他们,再次感谢你@user3190129
    【解决方案2】:

    让我看看我是否完全理解,按钮的动作取决于复选框?如果这是正确的,那么您可以为复选框值设置一个布尔值,或者只检查“isSelected”函数,在执行的操作方法中,我只需进行布尔检查并执行我需要的方法。

    JButton btn = new JButton("Calculate");
    btn.addActionListener(new ActionListener() {
     if(chckbxNewCheckBox.isSelected()){
      //do something here
     }else{
      //do this
     }
    }
    

    编辑: 为了重用代码,我还将在单独的方法中对按钮进行“执行操作”。 (如果我需要在另一个按钮或类似的东西中使用相同的方法)。

    【讨论】:

    • 您的想法很棒,但是您上面提到的使用 chckbxNewCheckBox 时无法识别,因为它位于 btn 之后且未在其之前声明,对此有何建议?
    • 看来@user3190129 回答了这个问题,抱歉花了一点时间才回复。希望它有效!
    猜你喜欢
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 2012-01-21
    • 1970-01-01
    • 1970-01-01
    • 2011-07-16
    相关资源
    最近更新 更多