JButtons повторно включить себя после отключения - PullRequest
0 голосов
/ 14 апреля 2010

У меня есть массив JButtons, которые образуют интерфейс клавиатуры. После ввода шести цифр я хочу отключить клавиатуру, чтобы пользователь не мог вводить другие цифры.

Я написал код, и кнопки отключаются до тех пор, пока мышь не парит над любой из них, а затем кнопки, кажется, снова активируются и запускают добавленные к ним actionEvents.

Полный код доступен здесь .

Возможные вещи, которые я считаю неправильными.

  1. Существует какой-то MouseListener, который игнорирует, когда я устанавливаю button.setEnabled(false);
  2. Я не отделил атрибуты от buildGUI(); правильно, я все равно сделал это только для того, чтобы внутренний класс мог получить к ним доступ.
  3. Возможно, что-то делать с gridLayout, так как отключение кнопок , кажется, работает для моих services кнопок JPanel.

Ответы [ 4 ]

3 голосов
/ 14 апреля 2010

Проблема заключается в том, как вы создали экземпляр своего Frame (CashMachine), а не (напрямую) с его реализацией.

Вы вызываете buildGUI дважды, один в конструкторе объекта, а затем в классе Driver, который создает экземпляр объекта. В результате вы создаете (и раскладываете) два набора кнопок.

Когда кнопки первого набора в конечном итоге были отключены, ваша активность мышки выявляла второй набор кнопок. А недостаток в вашей реализации ActionListener может привести к тому, что inputCount примет значения, превышающие 6, поэтому кнопки во втором наборе в конечном итоге не были отключены, как кнопки из первого набора.

buildGUI должен быть приватным; он должен вызываться в конструкторе CashMachine, а не в классе Driver.

И наоборот, на мой взгляд, CashMachine.setVisible должен вызываться классом Driver, а не конструктором CashMachine.

1 голос
/ 16 апреля 2010

Изучение файлов классов было полезно! Проблема в классе водителя: метод buildGUI() вызывается 2 раза: один раз в конструкторе CashMachine и второй в методе main после вызова конструктора.

public static void main(String args[])
{
    CashMachine cashmachine = new CashMachine();
    cashmachine.buildGUI();
}

Таким образом, вы получите двойное количество кнопок, то есть пару кнопок в каждой позиции. Но отключен только один из них.
Просто удалите вызов buildGUI из main (или из конструктора).
(Я бы изменил buildGUI на private, так как он не должен вызываться извне класса ...)

1 голос
/ 15 апреля 2010

Одним из возможных источников путаницы в вашей программе является смешивание цифровых клавиш с клавишами управления Clear и Enter. Рассмотрите возможность обработки цифровых клавиш отдельно с одним слушателем, как это предлагается в классе NumberButton, показанном ниже. Затем вы можете обрабатывать кнопки Clear и Enter по желанию. Кроме того, использование List<NumberButton> облегчает включение и отключение циклов.

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;

public class KeyPadPanel extends JPanel implements ActionListener {

    private static final int MAX = 6;
    private final List<NumberButton> numbers = new ArrayList<NumberButton>();
    private final JTextArea text = new JTextArea(1, MAX);
    private final JButton clear = new JButton("Clear");
    private final JButton enter = new JButton("Enter");

    public KeyPadPanel() {
        super(new BorderLayout());

        JPanel display = new JPanel();
        text.setEditable(false);
        display.add(text);
        this.add(display, BorderLayout.NORTH);

        JPanel pad = new JPanel(new GridLayout(4, 4));
        for (int i = 0; i < 10; i++) {
            NumberButton n = new NumberButton(i);
            numbers.add(n);
            if (i > 0) {
                pad.add(n);
            }
        }
        pad.add(clear);
        pad.add(numbers.get(0));
        pad.add(enter);
        clear.addActionListener(this);
        enter.addActionListener(this);
        this.add(pad, BorderLayout.CENTER);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        text.setText("");
        enableButtons();
    }

    private void enableButtons() {
        for (NumberButton n : numbers) {
            n.setEnabled(true);
        }
    }

    private void disableButtons() {
        for (NumberButton n : numbers) {
            n.setEnabled(false);
        }
    }

    private class NumberButton extends JButton implements ActionListener {

        public NumberButton(int number) {
            super(String.valueOf(number));
            this.addActionListener(this);
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            NumberButton b = (NumberButton) e.getSource();
            if (text.getText().length() < MAX) {
                text.append(b.getText());
            }
            if (text.getText().length() == MAX) {
                disableButtons();
            }
        }
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                JFrame f = new JFrame();
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.add(new KeyPadPanel());
                f.pack();
                f.setVisible(true);
            }
        });
    }
}
1 голос
/ 14 апреля 2010

Код работает просто отлично, я думаю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...