2012-09-11 3 views
3

У меня есть пример кода с помощью Swing.Действия, выполняемые на jButton после отключения

package playerlist; 

import java.awt.FlowLayout; 
import javax.swing.*; 
import java.awt.event.*; 

public class Sample extends JFrame{ 
    private JButton button1; 
    private JButton button2; 

    public Sample(){ 
     super(); 
     setTitle("Sample JFrame"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     button1 = new JButton("Button 1"); 
     button2 = new JButton("Button 2"); 

     button1.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       button1ActionPerformed(e); 
      } 
     }); 
     button2.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       button2ActionPerformed(e); 
      } 
     }); 

     setLayout(new FlowLayout()); 

     add(button1); 
     add(button2); 
     pack(); 
    } 

    private void button1ActionPerformed(ActionEvent ae){ 
     button1.setEnabled(false); 
     button2.setEnabled(false); 
     try{ 
       Thread.sleep(5000); 
     }catch(Exception e){ 

     } 
     System.out.println("*** Button 1 Clicked ***"); 
     button1.setEnabled(true); 
     button2.setEnabled(true); 
    } 

    private void button2ActionPerformed(ActionEvent ae){ 
     button1.setEnabled(false); 
     button2.setEnabled(false); 
     try{ 
      Thread.sleep(5000); 
     }catch(Exception e){ 

     } 
     // I have disabled this button from button 1's action, but still when I click this button within 
     // 5 seconds, actions of this button is performed 
     System.out.println("*** Button 2 Clicked ***"); 
     button1.setEnabled(true); 
     button2.setEnabled(true); 
    } 

    public static void main(String [] args){ 
     new Sample().setVisible(true); 
    } 
} 

Я хочу как - когда я нажимаю button1 (когда начинается действие BUTTON1 в), должны быть отключены button1 и button2 (если нажать на кнопку инвалидов, не следует проводить никаких действий). Я отключил обе кнопки, используя setEnabled (false). И когда действие кнопки 1 завершается, обе кнопки должны быть включены. Но в моем коде это не работает, даже после отключения кнопки, действия выполняются на отключенной кнопке. В действии кнопки1 я отключил обе кнопки и использовал метод сна, чтобы приостановить выполнение (для симуляции тяжелой работы) в течение 5 секунд, но в течение 5 секунд. Если я нажму на любую кнопку, их действия будут активированы после завершения действия кнопки1. Пожалуйста, помогите мне. Я предоставил образец кода, когда вы его запустили, и после нажатия кнопки1, затем сразу кнопку2, выполняются действия обеих кнопок. Я хочу, когда я нажимаю кнопки, тяжелая работа будет сделана в действии нажатия кнопки, а пока я отключу все кнопки, так что никаких других действий не будет. Когда первое действие завершится, я включу все кнопки. Пожалуйста, помогите мне. Спасибо заранее.

ответ

1

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

3
  • логика кода может быть правильной,

  • , но с одной ошибкой вы bloking по Thread.sleep(int)Event Dispatch Thread

  • должны изменить Thread.sleep(int) к Swing Timer

  • то первый шаг JButton#setEnabled(false) , остальная часть кода должна быть запущена с Swing Action, вызванная с Swing Timer

+0

+1 для не спать на EDT - хотя .. спать в действии Таймера не лучше: подтолкнет вас к редактированию, что вы на самом деле означаете длительную задержку (чтобы имитировать длительную задачу и проверить, что базовая логика OP в порядке :-) – kleopatra

+0

+1 Для тяжелой работы, также рассмотрите 'SwingWorker'; этот [пример] (http://stackoverflow.com/a/11372932/230513) отключает 'startButton' до' done() '. – trashgod

Смежные вопросы