2014-07-23 71 views
-1

我正在寫一個基於回合的互聯網遊戲。我嘗試彈出一個應該在前面的窗口,直到輸入流準備就緒。我創造了這樣的行爲,但它似乎不起作用。使用SwingUtilities.invokeLater彈出窗口

class CustomBlockerDialog extends JDialog { 
/** 
* 
*/ 
private static final long serialVersionUID = 1L; 

public CustomBlockerDialog(Frame owner, String text) { 
    super(owner, true); 
    setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); 
    setSize(300, 100); // Adjust if needed 
    setTitle(""); 
    add(new JLabel(text, SwingConstants.CENTER)); 
} 
} 




final CustomBlockerDialog block = new CustomBlockerDialog(null, "Not your turn"); 

SwingUtilities.invokeLater(new Runnable() {//A 

    @Override 
    public void run() { 
     System.out.println("show"); 
     block.setVisible(true); 
    } 
}); 


boolean one_write_only = true; 
while(in.ready()){ /* C*/ 
    if(one_write_only){ 
     System.out.println("waiting server"); 
     one_write_only = false; 
    } 
}; 

System.out.println("suppose to hide"); 

SwingUtilities.invokeLater(new Runnable() {//B 

    @Override 
    public void run() { 
    System.out.println("hide"); 
    block.setVisible(false); 
    } 
}); 

看起來「A」和「B」在「C」之後執行,我不知道爲什麼。

+0

............你好??? –

+0

對不起,很久沒有發帖了。我記得它,但我有很多工作。 – slawic

回答

0

由於氣墊船全鰻魚,我創建了一個有點不同的解決方案,它在我的情況下工作:

final SwingWorker<Object,Object> worker2 = new SwingWorker<Object, Object>() { 
     public Object doInBackground() throws Exception { 
      boolean one_write_only = true; 
      while(!in.ready()){ /* C*/ 
       if(one_write_only){ 
       System.out.println("waiting server"); 
       one_write_only = false; 
       } 
      } 
      return one_write_only; 
     } 

     protected void done() { 
      try { 
       block.setVisible(false); 
      } catch (Exception ignore) {} 
     } 

}; 
worker2.execute(); 
block.setVisible(true); 
2

您的問題必須是由於「C」在Swing事件線程上調用,而不是在後臺線程中,因爲它聽起來像「C」阻塞事件線程運行「A」。解決方案:確保「C」不在Swing事件線程上調用。如果是這種情況,並且可以通過運行SwingUtilities.isEventDispatchThread()方法來測試,則不需要所有其他可運行的程序。

// note that this all must be called on the Swing event thread: 
final CustomBlockerDialog block = new CustomBlockerDialog(null, "Not your turn"); 

System.out.println("show"); 
// block.setVisible(true); // !! no this will freeze! 

final SwingWorker<Void, Void> worker = new SwingWorker<>() { 
    public void doInBackground() throws Exception { 
     boolean one_write_only = true; 
     while(in.ready()){ /* C*/ 
     if(one_write_only){ 
      System.out.println("waiting server"); 
      one_write_only = false; 
     } 
     } 
    } 
} 

worker.addPropertyChangeListener(new PropertyChangeListener() { 
    public void propertyChanged(PropertyChangeEvent pcEvt) { 
     if (pcEvt.getNewValue() == SwingWorker.StateValue.DONE) { 
     System.out.println("hide"); 
     block.setVisible(false); 

     // call worker's get() method here and catch exceptions 
     } 
    } 
}); 

worker.execute(); 

// moved to down here since the dialog is modal!!! 
block.setVisible(true); 

警告:代碼沒有編譯或測試。從袖口輸入時可能存在錯誤。

+0

真的很感謝:) – slawic