Как отключить javax.swing.JButton в Java? - PullRequest
23 голосов
/ 26 октября 2009

Я создал приложение Swings и в графическом интерфейсе есть кнопка «Пуск». Я хочу, чтобы всякий раз, когда я нажимал на эту кнопку «Пуск», кнопка «Пуск» отключалась, а кнопка «Стоп» включалась.

Для этого я написал следующий код в методе «ActionPeformed (...)» кнопки «Пуск»

startButton.setEnabled(false);
stopButton.setEnabled(true);

Но приведенный выше код не создает желаемого эффекта в графическом интерфейсе.

Является ли приведенный выше код правильным для того, что я хочу сделать?

Он также не работает с "repaint ()".

Edit:

Код очень длинный, поэтому я не могу вставить весь код. Однако я могу рассказать больше о коде.

В методе "ActionPeformed" кнопки "start" после вызова двух вышеупомянутых операторов я выполняю поток "SwingWorker".

Эта тема создает какие-либо проблемы?

Ответы [ 3 ]

24 голосов
/ 26 октября 2009

Для этого я написал следующий код в методе «ActionPeformed (...)» кнопки «Пуск»

Этот код должен быть в actionPerformed(...) из ActionListener, зарегистрированном с помощью кнопки «Пуск», а не для самой кнопки «Пуск».

Вы можете добавить простой ActionListener, например:

JButton startButton = new JButton("Start");
startButton.addActionListener(new ActionListener() {
     public void actionPerformed(ActionEvent ae) {
        startButton.setEnabled(false);
        stopButton.setEnabled(true);
     }
   }
 );

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

7 голосов
/ 26 октября 2009

Код очень длинный, поэтому я не могу вставить весь код.

Может быть множество причин, по которым ваш код не работает. Может быть, вы объявили переменные кнопки дважды, чтобы фактически не изменять включение / выключение кнопки, как вы думаете. Может быть, вы блокируете EDT.

Вам необходимо создать SSCCE для публикации на форуме.

Так что вам решать, чтобы изолировать проблему. Начните с простой рамки с двумя кнопками и посмотрите, работает ли ваш код. Как только вы это заработаете, попробуйте запустить поток, который просто спит в течение 10 секунд, чтобы посмотреть, все ли еще работает.

Узнайте, как работает основной, прежде чем писать программу из 200 строк.

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

3 голосов
/ 26 октября 2009

Это работает.

public class TestButton {

public TestButton() {
    JFrame f = new JFrame();
    f.setSize(new Dimension(200,200));
    JPanel p = new JPanel();
    p.setLayout(new FlowLayout());

    final JButton stop = new JButton("Stop");
    final JButton start = new JButton("Start");
    p.add(start);
    p.add(stop);
    f.getContentPane().add(p);
    stop.setEnabled(false);
    stop.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            start.setEnabled(true);
            stop.setEnabled(false);

        }
    });

    start.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            start.setEnabled(false);
            stop.setEnabled(true);

        }
    });
    f.setVisible(true);
}

/**
 * @param args
 */
public static void main(String[] args) {
    new TestButton();

}

}

...