JButton打印多次而不是一次。为什么?

时间:2018-10-10 18:03:25

标签: java swing awt jbutton actionlistener

我有一个JButton,代码在下面。按下时,它将在控制台上打印3次,而不是一次。为什么要这样做以及如何解决?提前致谢!我还发布了代码牧场。

    change61 = new JButton("N");
    change61.setLocation(0,0);
    change61.setSize(25,14);
    change61.setFocusPainted(false);
    change61.setBorder(new LineBorder(Color.BLACK));
    change61.setMargin(new Insets(0,0,0,0));
    change61.setFont(new Font("Arial", Font.BOLD, 7));
    change61.setRolloverEnabled(false); // TEST
    change61.addActionListener(this);
    change61.setActionCommand("Normal");
    buttons16.add(change61);   

    change61.getModel().addChangeListener(new ChangeListener() {
            @Override
            public void stateChanged(ChangeEvent e) {
                ButtonModel model = change61.getModel();
                if (model.isArmed()) {
                    cl1.setIcon(CL2);
                    lvrvr1.setIcon(LVRL);
                    dsw1.setIcon(LSIG);
                    dsy1.setIcon(CL1);
                    b1b.setIcon(LHC);
                    System.out.println("Button Pressed"); // THIS GETS PRINTED 3 TIMES TO CONSOLE INSTEAD OF ONCE

                } else {
                    cl1.setIcon(CL1);
                }
            }
        });

2 个答案:

答案 0 :(得分:0)

在stateChagned方法中,使用isPressed代替isArmed。应该可以。

或者按照@camickr的建议

change61.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                    cl1.setIcon(CL2);
                    lvrvr1.setIcon(LVRL);
                    dsw1.setIcon(LSIG);
                    dsy1.setIcon(CL1);
                    b1b.setIcon(LHC);
                    System.out.println("Button Pressed"); // THIS GETS PRINTED 3 TIMES TO CONSOLE INSTEAD OF ONCE
            }
        });

答案 1 :(得分:0)

由于这个问题让我着迷,所以我想知道为什么会被解雇三遍。

正如堆栈跟踪所揭示的那样,更改是由鼠标事件触发的。

首先,按下鼠标。它调用DefaultButtonModel.isArmed(true)和DefaultButtonModel.isPressed(true)。每种方法都会触发一个更改事件。在这里,我们有第一次和第二次迭代。 其次,释放鼠标。它调用DefaultButtonModel.isPressed(false),再次触发更改事件。第三次迭代。

仅供参考,DefaultButtonModel是ButtonModelInterface的实现。