我只是想知道...如何阻止主线程,因为 JOptionPane(其确认对话框)能够保持执行直到它返回某个值?我以前从未这样做过,所以我有兴趣找到最佳方法......
更清楚地说,我有兴趣将这个概念表达为这样的东西,但我不确定如何让它等到弹出菜单中发生事件,例如:
...
int a;
int x;
void showPopup()
{
a=MyPopupMenu.aPopupMenu();
if(a==0){System.out.println("YES");}
if(a==1){System.out.println("NO"); return;}
x++;
}
谢谢
最佳答案
使用等待/通知。主线程将执行以下操作:
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");
}
}
关于java - 如何像 JOptionPane 那样阻塞主线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9952049/