我不確定如何解決這個問題,但是在做了一些閱讀和大量嘗試(失敗)之後,我決定向社區尋求幫助。我有表格A,打開並要求用戶輸入一個時間來延遲表格B的打開。目前我正在使用sleep()
來做到這一點,但現在我想插入另一個對話框,以允許用戶在計時器用完之前中斷計時器並調出表格B.我相信正確的方法是使用wait()
和notify()
,但我似乎無法圍繞衆多生產者和消費者模型的例子。任何幫助表示讚賞。Wait(),Notify(),定時器和Jbuttons
0
A
回答
0
最簡單的方法是在做這樣的事情
Thread a = new Thread(new Runnable(){
public void run(){
//do whatever display
try{
Thread.sleep(timeToShowBform);
}
catch(InterruptedException ex){
//interrupted.
}finally{
//show form B
SwingUtilities.invokeLater(...)
}
});
class BRunnable implements Runnable{
public void run(){
//if clicked, then this runnable is called.
a.interrupt();
}
}
線程a
假設被阻塞在sleep
,然後調用a.interrupt()
它醒來a
。
1
javax.swing.Timer
的完美工作。詳情請參閱How to Use Swing Timers。這裏有一個例子可以指導你正確的方向。
import java.awt.*;
import java.awt.event.*;
import javax.swing.Timer;
import javax.swing.*;
public class TimerDemo extends JFrame implements ActionListener {
private Timer timer;
private JButton jbDoSomethingDelayed;
private JButton jbDoItImmediately;
public TimerDemo() {
setLayout(new FlowLayout());
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setTitle("Timer demo");
jbDoSomethingDelayed = new JButton("Do something with a delay");
jbDoItImmediately = new JButton("Do it. Do it NOW!");
add(jbDoSomethingDelayed);
add(jbDoItImmediately);
jbDoItImmediately.setEnabled(false);
timer = new Timer(0, this); // we override delay later
timer.setRepeats(false); // we don't want it firing repeatedly
jbDoSomethingDelayed.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String msg = "Enter delay and confirm dialog";
JSpinner spinner = new JSpinner(new SpinnerNumberModel(5, 1, 10, 1));
Object[] content = new Object[] {msg, spinner};
int showConfirmDialog = JOptionPane.showConfirmDialog(TimerDemo.this, content, "Choose", JOptionPane.OK_CANCEL_OPTION);
if (showConfirmDialog == JOptionPane.OK_OPTION) {
// the important part
timer.setInitialDelay(((Integer)spinner.getValue()) * 1000);
jbDoSomethingDelayed.setEnabled(false);
jbDoItImmediately.setEnabled(true);
timer.start();
}
}
});
jbDoItImmediately.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
timer.stop();
onTimerTimeout();
}
});
pack();
setLocationRelativeTo(null);
}
public void actionPerformed(ActionEvent e) {
// called by timer on EDT, no worries here
onTimerTimeout();
}
private void onTimerTimeout() {
jbDoSomethingDelayed.setEnabled(true);
jbDoItImmediately.setEnabled(false);
JOptionPane.showConfirmDialog(this, "You've done it now. No, really...", "It is done", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
TimerDemo demo = new TimerDemo();
demo.setVisible(true);
}
});
}
}
相關問題
- 1. Java wait()&notify()vs Android wait()&notify()
- 2. IllegalMonitorStateException notify()和wait()
- 3. 主題:Wait()和notify()
- 4. wait和notify問題
- 5. 正確使用wait和notify
- 6. 如何使用wait \ notify處理器?
- 7. 在多線程中使用wait()和notify()
- 8. 程序獲取暫停:wait()和notify()
- 9. Java - 兩個線程wait()和notify()
- 10. 瞭解wait()和notify()的必要性
- 11. 如何正確使用wait()和notify()
- 12. 同步語句中的wait(),notify()和notifyAll()
- 13. 在這裏調用'wait'和'notify'
- 14. 控制線程使用wait()和notify()
- 15. wait和notify不是靜態的
- 16. 如何在Java中使用wait()和notify()?
- 17. Wait()和Notify()概念 - Java多線程
- 18. Java線程wait()notify()方法
- 19. 如何處理wait()notify()?
- 20. Java定時器使用JButtons
- 21. Java線程wait()&notify()與並行任務
- 22. Java notify()在wait()之前被調用
- 23. 使用wait/notify創建活動課程
- 24. wait()沒有通過notify()回調
- 25. NiFi - 使用Wait/Notify觸發GetFTP
- 26. 如何在Java中使用wait()/ notify()
- 27. 創建和查殺線程與使用.notify()和.wait()
- 28. 如何通過notify/wait()喚醒/暫停特定(一組)線程?
- 29. 如何用wait()和notify()正確地暫停線程
- 30. new to multithreading-如何在java中使用wait()和notify()?
不要阻塞EDT(Event Dispatch Thread) - 當發生這種情況時GUI將「凍結」。而不是調用'Thread.sleep(n)'爲延遲任務實現一個Swing'Timer'。有關更多詳細信息,請參見[Swing中的併發](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/)。 –