簡體   English   中英

Java 8 + Swing:模態對話框理論

[英]Java 8 + Swing: Modal Dialog Theory

我正在開發一個具有以下功能的應用程序:

  • 該應用程序將具有“加載圖像”按鈕,以打開圖像和設置模式對話框。 它需要阻塞直到該對話框返回,否則返回處理結果,或者如果用戶改變主意,則返回null。
  • 圖像和設置對話框將允許用戶使用JFileChooser對話框選擇圖像,並指定處理圖像的詳細程度。 單擊“加載”按鈕將打開一個加載對話框。
  • 加載對話框需要是一個自定義設計的對話框,該對話框詳細報告有關費時的圖像處理。 如果用戶允許處理完成,則需要關閉該對象並將其返回到原始對話框,后者需要關閉並將該對象返回給應用程序。 如果用戶認為執行處理花費的時間太長,則可以取消加載,關閉加載對話框並返回到圖像和設置對話框。

從概念上講,這對我來說似乎並不困難。 但是,當我嘗試確定如何使其在Swing中運行時,無法以某種方式將其組合在一起。 根據我的閱讀,GUI組件需要在Swing的事件線程中實例化,因為其中許多都不是線程安全的。 這些相同的組件需要阻塞類似於JOptionPane.showInputDialog()方法的調用(但由於我需要編寫自定義組件,所以不相同JOptionPane.showInputDialog() 但是這些調用需要實例化事件線程中的新組件,並等待事件線程中發生事件,然后再將值返回給應用程序。 再加上我需要從對話框中彈出一個對話框的事實,我感到很失落。

我已經閱讀了對話框上Java教程,以及StackOverflow和其他站點上的幾篇文章,試圖確定如何設計可以正常工作的類。 不知何故,我只是根本不了解它是如何工作的(事件線程在第一次阻塞調用后就不會進入睡眠狀態?),以及如何編寫實現此工作所需的自定義類。 坦白說,我不確定自己對混亂的理解程度是否足以解釋這一點。

有人可以說明模態對話框實例化后幕后發生的事情嗎? 我如何編寫行為如上所述的對話框類?

該應用程序將具有“加載圖像”按鈕,以打開圖像和設置模式對話框。 它需要阻塞直到該對話框返回,否則返回處理結果,或者如果用戶改變主意,則返回null。

確定,因此此對話框將需要是模式對話框。 我們知道的那么多。

圖像和設置對話框將允許用戶使用JFileChooser對話框選擇圖像,並指定處理圖像的詳細程度。 單擊“加載”按鈕將打開一個加載對話框。

單擊確定,因此需要在圖像和設置對話框的前面關閉加載對話框。 那里也沒有大佬。

加載對話框需要是一個自定義設計的對話框,該對話框詳細報告有關費時的圖像處理。 如果用戶允許處理完成,則需要關閉該對象並將其返回到原始對話框,后者需要關閉並將該對象返回給應用程序。 如果用戶認為執行處理花費的時間太長,則可以取消加載,關閉加載對話框並返回到圖像和設置對話框。

好的,因此加載對話框代碼將需要實例化並執行SwingWorker以在后台線程中進行耗時的圖像處理,然后讓SwingWorker使用其發布/處理方法對將有關處理詳細信息的信息推回給加載對話框。

...據我所讀,GUI組件需要在Swing的事件線程中實例化,因為許多組件都不是線程安全的。

正確。

這些相同的組件需要阻止類似於JOptionPane.showInputDialog()方法的調用(但由於我需要編寫自定義組件,所以不相同)。

這就是模態JDialog允許您執行的操作。 要記住的另一種選擇是使用JOptionPane並將JPanel傳遞給想要JOptionPane顯示的任何GUI。 JOptionPanes出奇地靈活和有用。

但是這些調用需要實例化事件線程中的新組件,並等待事件線程中發生事件,然后再將值返回給應用程序。 再加上我需要從對話框中彈出一個對話框的事實,我感到很失落。

再次簡單。 加載對話框將調用SwingWorker,該SwingWorker將與加載對話框進行通信。

有人可以說明模態對話框實例化后幕后發生的事情嗎?

現在您可能要求這個站點上的志願者做太多事情,因為這個問題可能需要有人編寫完整的教程來回答,並且之前已經有人問過並回答過,因此您應該可以發現這些信息。 。 如果您真的想了解實際情況,則應首先自己對該主題進行初步研究,查看源代碼,如果仍然遇到問題,請先做一個更具體,可回答的問題盡職調查工作。

從主要事件循環開始的模態對話框會生成一個次要事件循環,當主要循環被阻止時,該活動仍保持活動狀態。 參見java.awt.SecondaryLoop。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM