2012-03-31 52 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