使用等待/通知。主线程会做:
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