JButton печатает несколько раз, а не один раз.Зачем? - PullRequest
0 голосов
/ 10 октября 2018

У меня есть 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 голосов
/ 11 октября 2018

Поскольку этот вопрос меня зацепил, я хотел знать, почему он запускается три раза.

Как показывает трассировка стека, изменения запускаются событием мыши.

Сначала мышь нажимают.Он вызывает DefaultButtonModel.isArmed (true) и DefaultButtonModel.isPressed (true).Каждый метод вызывает событие изменения.Здесь мы имеем первую и вторую итерацию.Во-вторых, мышь отпущена.Он вызывает DefaultButtonModel.isPressed (false), снова вызывая событие изменения.Третья итерация.

К вашему сведению, DefaultButtonModel - это реализация интерфейса ButtonModel.

0 голосов
/ 10 октября 2018

В методе 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
            }
        });
...