2014-09-06 56 views
0

我的Java Swing應用程序執行大量的HTTP請求,本質上,它會凍結屏幕,直到接收到響應並進行處理。UI上的Java Swing強制光標外觀變化線程

我想在這段時間顯示等待光標,使用:

frame.setCursor(JFrame.WAIT_CURSOR); 

不幸的是,這不是因爲它正在對UI線程將繼續處理我的HTTP請求的執行工作。

我知道我應該在一個單獨的Swing Worker線程上執行冗長的任務,但爲了保持我的代碼的簡單性(因爲在某些情況下,我的HTTP請求可能被中斷以顯示需要在其上執行的對話UI線程),我正在尋找一個解決方案來「強制」擺動,以在執行未來代碼之前更新鼠標光標。

有什麼辦法可以達到這個目的嗎?

+0

*「有什麼辦法可以實現這個嗎?」*不符合你目前的方法,你可以使用'SwingUtilities.invokeAndWait'從SwingWorker中的UI請求更多細節,但更簡單的解決方案是將設計一個解決方案,將問題的細分劃分爲背景/非UI和UI部分...... – MadProgrammer 2014-09-06 20:54:30

回答

1

我的Java Swing應用程序執行多個HTTP請求,通過自然,直到接收並處理響應凍結屏幕的。

沒有。不是天生的!
僅在EDT(Event-Dispatch-Thread)中執行長操作(如HTTP請求)時。
嘗試使用SwingWorker。

你可以到這裏看看:https://stackoverflow.com/a/782309/3887073

編輯:
設置的自定義光標(做長時間操作之前),您可以嘗試使用:

SwingUtilities.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       /*change cursor code here*/ 
      } 
     }); 

但這可能沒有幫助。 (我沒有測試)
無論如何,絕對推薦使用SwingWorker。

+0

Thx但這正是我所解釋的:它在UI線程上執行(即EDT線程),我想盡量避免使用SwingWorker,因爲我的情況非常複雜(工作可能會中斷並打開對話框) – Tom 2014-09-06 20:48:10

+0

@Tom然後使用'Thread',但請記住,Swing不是線程安全的,所有交互和修改UI必須在EDT – MadProgrammer 2014-09-06 20:51:59

+0

的範圍內進行,請參閱我編輯的答案。 – Ben 2014-09-06 20:53:32

1

我知道,我應該在一個單獨的Swing Worker線程執行冗長的任務,

然後就是你應該做的事情。

但是,讓我的代碼簡單(因爲在某些情況下,我的HTTP請求可以被中斷,顯示一個對話框

那麼「中斷代碼」應使用SwingUtitlities.invokeLater(...)創建和顯示對話框