2012-03-31 127 views
2

我只是想知道...如何阻止主线程作为JOptionPane(它的确认对话框)能够保持执行,直到它返回一些值?我从来没有这样做过,所以我有兴趣找到一个最佳的方式...如何阻止主线程为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++; 
} 

感谢

+2

主线程不停止,只是当您调用方法来显示对话框时,该方法不会返回,直到用户使用完它。主线程继续执行,只是它滞留在对话框类的某个循环中。这种对话行为称为模态 - 如果对话是模态的,那么在对话框关闭之前,用户不能与对话之外的任何事物进行交互。 – 2012-03-31 00:53:59

+0

好的,但是如果我想模拟“模态”呢?有没有办法? – user592704 2012-03-31 02:53:14

+0

发布您遇到问题的代码。 – Java42 2012-03-31 05:04:04

回答

2

使用等待/通知。主线程会做:

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"); 
} 
} 
+0

我试过这个,但如果我把等待部分放在aPopupMenu()方法体的末尾,popupmenu永远不会显示:(你能否提供更多的细节请 – user592704 2012-04-01 02:36:50

+0

@ user592704我将编辑并添加一个示例。 – Java42 2012-04-01 02:50:59

2

而不是使用静态JOptionPane方法,您可以直接使用JDialog的实例,使您能够定制其行为,如modality的。

+0

我很喜欢使用JDialog或通常在这个方向的东西,但事情是我有兴趣为任何Swing组件获得“模态效果”,例如:SI看到的代码像http://stackoverflow.com/a/ 1595795/592704但它使用SwingWorker;我不确定它会在问题案例中起作用吗? – user592704 2012-03-31 06:42:46