2012-05-16 2 views
0

У меня есть две кнопки в моей графической форме Netbeans. Одна кнопка - кнопка запуска, а другая - кнопка остановки. Когда я нажимаю кнопку запуска, мой код работает хорошо, но когда я пытаюсь остановить, кнопка остановки кажется отключенной. Я не могу нажать кнопку остановки.java: кнопки netbeans gui не работают одновременно

Мой код начинается с GUI, в котором это мой код для запуска кнопки

private void jButton2MouseClicked(java.awt.event.MouseEvent evt) { 
    live p=new live(); //this calls the method of my application 
    p.livecapture(); 
} 

код кнопки остановки

private void jButton1MouseClicked(java.awt.event.MouseEvent evt) { 
    mm=2; 
} 

Следующая в то время как цикл присутствует в моем livecapture() методе

while(NewJFrame.mm!=2) { 
} 
+2

Вы должны показать нам свой код, чтобы мы могли знать, в чем проблема. –

+0

Да, пожалуйста, отправьте код –

ответ

4

Предложения:

  • Убедитесь, что ваша петля захвата отключена от потока событий.
  • Если в потоке событий либо сдвиньте его, либо используйте таймер Swing.
  • Дайте классу захвата переменную состояния, которая остановит его цикл и метод setter, чтобы другие классы могли сказать ему остановиться.
  • В этом цикле проверите его переменную состояния, и если она установлена, остановите цикл.
  • Пожалуйста, прочтите и соблюдайте соглашения об именах Swing. Ваш код не придерживается их, что затрудняет для посторонних (нас!) Чтение и понимание.

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

+0

Можете ли вы усовершенствовать, как я буду использовать Swing Timer вместо while здесь. – Xara

+0

Мой живой класс захватывает пакеты, поступающие на интерфейс. – Xara

+0

@ Zara: Так делает это с потоком событий? Посмотрите на превосходное предложение Джейми по этому поводу (1+ для него за это). –

4

Я не уверен в вашей ситуации, но похоже, что вы выполняете свой код из потока диспетчеризации событий (EDT). Это нить в вашей программе, которая отвечает за прослушивание ваших событий, генерируемых графическим интерфейсом (в частности). Если ваш EDT занят обработкой кода в прослушивателе для кнопки «Пуск», он будет слеп любым другим нажатиям кнопок, которые происходят.

Чтобы предотвратить это, вы должны сделать свою программу многопоточной. Это огромная тема на любом языке программирования, но вот простой пример одного из многих способов, это может быть сделано в Java, с помощью Swing Worker:

class MyWorker extends SwingWorker<Void, Void> { 
    public Void doInBackground() { 
     // The code you want to run 
     return Void; 
    } 
} 

MyWorker thread = new MyWorker(); 

startButton.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
     thread.execute(); 
    } 
}); 

endButton.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
     thread.cancel(); 
    } 
}); 
Смежные вопросы