2013-10-09 55 views
2

我正在創建一個應用程序,在該應用程序中測試一定數量的接口功能,並且當發生錯誤時,我想要顯示一條錯誤消息。
然後,應用程序應該截屏整個屏幕,最後在沒有任何用戶幫助的情況下關閉錯誤消息。無需用戶操作自動關閉Jdialog

爲此,我試圖用的JDialog如下:

JOptionPane pane = new JOptionPane("Error message", JOptionPane.INFORMATION_MESSAGE); 
    JDialog dialog = pane.createDialog("Error"); 
    dialog.addWindowListener(null); 
    dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); 
    dialog.setVisible(true); 
    Application.takeScreenshot(); 
    dialog.setVisible(false); 

我想知道是否有將其關閉的具體方法。我查閱了文檔,我似乎無法找到它。我試圖找到一個關於SO的相關問題,但找不到解決我的問題的問題。

我不知道是否有辦法獲得窗口句柄,然後關閉它,或者只是發送一個「CLOSE」或「Press_ok」事件到窗口?

編輯:在我看來,當消息框顯示時,代碼完全停止運行,就好像有一個Thread.sleep(),直到用戶手動關閉窗口。

如果可能的話,代碼示例會有幫助。

感謝

+0

請看看這個奇妙的[answer](http://stackoverflow.com/q/18105598/1057230),這肯定會以更好的方式工作:-) –

回答

2

嘗試使用ScheduledExecutorService。喜歡的東西:

JDialog dialog = pane.createDialog("Error"); 
    dialog.addWindowListener(null); 
    dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); 

ScheduledExecutorService sch = Executors.newSingleThreadScheduledExecutor();  
sch.schedule(new Runnable() { 
    public void run() { 
     dialog.setVisible(false); 
     dialog.dispose(); 
    } 
}, 10, TimeUnit.SECONDS); 

dialog.setVisible(true); 

[編輯]

問候camickr評論,文件沒有提到一個ScheduledExedcutorService執行對事件指派線程。所以更好使用swing.Timer

JDialog dialog = pane.createDialog("Error"); 
dialog.addWindowListener(null); 
dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); 

Timer timer = new Timer(10000, new ActionListener() { // 10 sec 
      public void actionPerformed(ActionEvent e) { 
       dialog.setVisible(false); 
       dialog.dispose(); 
      } 
     }); 

     timer.start(); 

     dialog.setVisible(true); 
+0

可能會在Java7中產生副作用對於更長的延遲,然後dialog.whatever將被稱爲出來美國東部時間 – mKorbel

+0

良好的提示,我從來沒有使用超過20秒,有doc。參考? –

+0

http://docs.oracle.com/javase/7/docs/api/java/awt/Dialog.html#setModalityType%28java.awt.Dialog.ModalityType%29 – user2863138

1

我已經設法解決它。看起來,默認情況下,JDialog是Modal,意思是它會中斷其他所有事情,直到用戶關閉它爲止。爲了解決這個問題,我使用的方法:

dialog.setModalityType(Dialog.ModalityType.MODELESS); 

當這是活性,一個簡單的.setVisible(假);足夠。 無論如何感謝幫助抱歉創建一個不必要的問題,但我已經在它幾個小時,直到我找到它。希望它能幫助別人。

+0

將'JDialog'設置爲false是不夠的,因爲它仍然會保留。處置它是要走的路。而且,我上面提到的鏈接中引用的例子並沒有堅持'JDialog'是否是模態的。 –