簡體   English   中英

從EDT問題Java搖擺進度條

[英]Java swing progress bar from EDT problem

這是針對那里的搖擺專家。 我花了相當多的時間來解決這個問題,所以我需要幾行來解釋這個問題。

我有一個獨立的java swing應用程序(java 6)。 在我的應用程序中,我有一個帶有單選按鈕組的框架。 我有一個鏈接到組中所有按鈕的操作。 該操作檢查以查看選擇了哪個單選按鈕並執行某些操作。 “工作”涉及一些背景計算以及我的應用程序中的兩個其他框架中的一些繪畫。 后台計算是多線程的。

我想在用戶選擇其中一個單選按鈕時顯示進度條。 但是,當選擇單選按鈕時,在發生對單選按鈕的操作時,進度條永遠不會出現。 我嘗試了jdialog類型的進度條,玻璃窗格等。在“工作”全部完成之前,它們都沒有出現。 這似乎是因為Swing沒有完成對單選按鈕的繪制,直到相應動作中的“工作”完成。 由於EDT一次只做一件事,因此從不顯示進度條對話框(或玻璃窗格)。

然后我嘗試使用SwingWorker來完成所有這些“工作”。 啟動進度條(或激活玻璃窗格),啟動SwingWorker並關閉SwingWorker的done()方法中的進度條(或停用玻璃窗格)。 這似乎提升了進度條很好,但是作為“工作”一部分的繪畫有時候沒有完成,留下了一些繪畫工件(paintComponent方法非常復雜,所以不想在這里重現)。 如果我調整窗口大小,工件就會消失。 事實上,如果我使用擴展Thread而不是SwingWorker的類,就會發生這種情況。 這都是因為Swing不是線程安全的,我試圖從除EDT之外的線程進行GUI工作。 我明白那一部分。

我該怎么辦? “工作”大約需要30秒,如果沒有向用戶顯示程序正在運行的某種跡象,那么這似乎太長了。 我也嘗試將光標更改為等待光標並遇到與上述相同的問題。 我唯一能做的就是禁用框架並將框架的標題設置為“work ......”等文本。

以前有人見過這個問題嗎?

當你將作品從EDT移動到搖擺工作者(這是正確的事情)時,聽起來工作和繪畫都轉移到搖擺工作者身上。 這幅畫應該仍然在美國東部時間發生。 您可以通過使用SwingUtilities.invokeLater從后台線程調用重繪,或者使用SwingWorker.publish(V ...)來實現此目的,它將從您的工作線程獲取通知,並通過SwingWorker在EDT上使用它們.process(V ...)模板方法(您覆蓋)。 您的process覆蓋可以通過重新繪制屏幕的一部分,更新進度或根據需要采取其他適當的操作來處理中間通知。 在此處完成的任何UI更改都將可見,而無需等待其余工作完成。

我認為你在SwingWorker線程中完成這項工作是正確的,但你不應該試圖在那里做你的繪畫。

我傾向於:

  • 讓ActionListener show()進度條,設置swingworker然后退出

  • 讓工作線程完成工作,並定期調用進度條組件上的repaint()(這保證是線程安全的)

  • 進度條有自己的paintComponent(將在EDT上自動調用)。 如有必要,可以讀取工作線程更新的一些變量來測量進度

  • 當工作線程完成時,讓它調用invokeLater()以在EDT上運行最終關閉功能,這將隱藏進度條並執行任何其他與GUI相關的清理/向用戶顯示完成消息等。

暫無
暫無

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

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