這是簡化的代碼,可以通過按下我的主JFrame類中的按鈕來調用。使用此代碼,然後解除其中一個生成的對話框,導致我的Java會話中的所有活動窗口都鎖定或僅消失。多個showMessageDialogs可以擺動擺動嗎?
//Broken code
private void buttonActionPerformed(java.awt.event.ActionEvent evt) {
List<JFrame> frameList = new ArrayList<>();
frameList.add(new TestJFrame());
frameList.add(new TestJFrame());
frameList.forEach(frame -> frame.setVisible(true));
frameList.forEach(frame -> {
SwingUtilities.invokeLater(() -> {
JOptionPane.showMessageDialog(frame, "Msg", "Title", 0);
frame.setVisible(false);
frame.dispose();
});
});
}
但是,如果我要刪除SwingUtilities.invokeLater()
部分,然後它就像我預料(彈出對話框,關閉對話框,窗口消失了,重複)。
//Working code
private void buttonActionPerformed(java.awt.event.ActionEvent evt) {
List<JFrame> frameList = new ArrayList<>();
frameList.add(new TestJFrame());
frameList.add(new TestJFrame());
frameList.forEach(frame -> frame.setVisible(true));
frameList.forEach(frame -> {
//SwingUtilities.invokeLater(() -> {
JOptionPane.showMessageDialog(frame, "Msg", "Title", 0);
frame.setVisible(false);
frame.dispose();
//});
});
}
我寧可不使用第二個,因爲實際的代碼是在被告知一組聽衆的後臺線程正在啓動,所以如果我是使用第二個話,那就堵了線程和減慢監聽器,直到用戶響應(當我可以在那段時間處理時)。 invokeLater()
怎麼樣打破了我?這是預期的行爲?
注:這是簡化代碼掏出我如何真正使用它,但核心問題依然存在(我有多個JFrame
秒,如果多個JOptionPane.showMessageDialog()
小號被提上invokeLater()
S代表不同的JFrame
當時的它我測試了上面的代碼,並在Netbeans中創建了一個新的,分離的JFrame
類,並且能夠重現錯誤。 Linux。
根據揮杆文件,'從1.3版本開始,此方法只覆蓋了java.awt.EventQueue.invokeLater()' ,所以我不明白這將如何解決任何問題?我不能只使用簡單的線程,因爲圖形相關事件需要在EDT上發生。 – billie
是的,他們都應該固有工作相同,但你永遠不知道。至於簡單的線程在某些情況下,您可以使用一個ex。 JTextArea和做GIF動畫。嘗試使用SwingWorker作爲EDT [SwingWorker](https://docs.oracle.com/javase/7/docs/api/javax/swing/SwingWorker.html) – Pierre97
'EventQueue.invokeLater()'的結果與' SwingUtilities.invokeLater()'。 '新的SwingWorker(){...} .execute()'也以類似的方式失敗,只是有一些額外的重繪失敗。 – billie