使用等待/通知。主線程會做:
synchronized(object) {
object.wait(timeOut);
}
和處理程序(即監聽程序)進行任何GUI使用的是(在你的例子一個彈出)會做:
synchronized(object) {
object.notify();
}
這裏是一個精簡教學例如使用wait/notify
public class ModalPopUp {
JPopupMenu popUpMenu;
JMenuItem menuItem;
static Object modalMonitor = new Object();
public void popIt(Component parent, int x, int y) {
popUpMenu.show(parent, x, y);
}
public void stopIt() {
popUpMenu.setVisible(false);
}
public ModalPopUp() {
popUpMenu = new JPopupMenu();
menuItem = new JMenuItem("Click me to Continue");
popUpMenu.add(menuItem);
menuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
synchronized (modalMonitor) {
modalMonitor.notify();
}
}
});
}
public static void main(String args[]) throws Exception {
ModalPopUp p = new ModalPopUp();
JFrame frame = new JFrame();
frame.setSize(400, 400);
frame.setVisible(true);
p.popIt(null, 100, 100);
System.out.println("Waiting upto 42s for popup click");
synchronized (modalMonitor) {
modalMonitor.wait(42000);
}
p.stopIt();
System.out.println("Popup was clicked or 42s passed");
}
}
主線程不停止,只是當您調用方法來顯示對話框時,該方法不會返回,直到用戶使用完它。主線程繼續執行,只是它滯留在對話框類的某個循環中。這種對話行爲稱爲模態 - 如果對話是模態的,那麼在對話框關閉之前,用戶不能與對話之外的任何事物進行交互。 – 2012-03-31 00:53:59
好的,但是如果我想模擬「模態」呢?有沒有辦法? – user592704 2012-03-31 02:53:14
發佈您遇到問題的代碼。 – Java42 2012-03-31 05:04:04