2012-02-18 17 views
0

我有一個JTable,當用戶點擊列標題時,它將從數據庫中重新加載排序後的數據。 MainView(JFrame)包含將創建一個新的SwingWorker並啓動它的GUI元素。 SwingWorker的doInBackGround()函數將MainView的遊標更改爲等待遊標。然後,當doInBackground()函數完成其工作並且在離開doBackground函數之前,它將光標變回默認光標。爲什麼在更新JTable中的數據時,我的等待光標有時不顯示?

有時光標會出現,但過了一段時間後,每次單擊標題時都會停止顯示光標。它可能在最初幾次運行,似乎是隨機的。

爲什麼光標有時會顯示,而不是其他的?有沒有一種特別的方法可以設置等待光標?我應該從SwingWorker線程還是從MainView GUI線程設置等待遊標?

+3

爲了得到更快的幫助,請發佈[SSCCE](http://sscce.org/)。 – 2012-02-18 02:47:10

回答

1

您應該在doinbackground之前設置等待光標。我已經在調用execute之前在工作線程類的構造函數中完成了該工作。您需要在完成的方法中將光標恢復到正常狀態。這可能是您的問題所在。 done方法在事件派發線程上運行,該線程必須用於UI更新。

不要從doinbackground方法更新任何gui組件,否則會看到這種類型的行爲。我不知道,做了同樣的事情。它可能會令人困惑。

+0

謝謝,我會試試這個 – 2012-02-18 04:36:31

0

您可能希望讓您的jtable對數據進行排序,而不是再次調用數據庫。安裝非常簡單。 table sorting

+0

我試過了,但是,它不適合日期。我希望爲顯示的日期設置一定的格式,並且不會按照所需的格式正確地按照時間戳對它們進行排序。我也有一個過濾器按鈕,它會顯示一個等待光標以及發生這種情況。 – 2012-02-18 06:02:26

+0

哦,是的,日期和JTables ...我需要在我的程序中相同的東西。您必須將單元格格式化爲Date對象而不是普通對象。我還沒有真正做到這一點。我想你只是將該列的表模型的列類定義爲Date.class對象。然後它將它視爲日期值。儘管如此,我還沒有想到這一點。 – Logan 2012-02-18 14:01:44

+0

Logan我相信我也這樣做了,它沒有工作。我現在通過調用db來調用代碼,並且可能不會更改它,因爲它需要太多的重新測試 – 2012-02-20 16:17:34

0

Oracle's Swing Concurrency page

Swing事件處理代碼上被稱爲事件 調度線程一個特殊的線程運行。調用Swing方法的大多數代碼也可以在此線程的 上運行。這是必要的,因爲大多數Swing對象方法不是「線程安全」的: :從多個線程調用它們可能會導致線程干擾或內存一致性錯誤 。

SwingWorker API頁的報告,關於doInBackground()方法:

計算結果,或拋出一個異常,如果無法做到這一點。

然後,它用於從工作人員執行一些任務,在工作線程上執行。

和有關done()方法:

doInBackground方法 完成後,在事件指派線程執行。默認實現什麼都不做。子類可能會 重寫此方法以在事件 調度線程上執行完成操作。請注意,您可以查詢 執行此方法內部的狀態,以確定此任務的結果或 此任務是否已被取消。

通常,它用於在doInBackground()完成其工作後顯示最終結果。

然後,我想你應該使用類似的代碼將光標定位在doInBackground() SwingWorker的方法 :

public Void doInBackground() { 
    setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); 
... 
} 

,並取消它的done() SwingWorker的方法,具有:

public void done() { 
setCursor(Cursor.getDefaultCursor()); 
... 
} 

你可以請在Cursor類API上查找有關這些遊標方法的其他信息。

Here頁面上有一些繁忙的光標代碼示例,here這是一個與光標相關的SO問題。

+0

要小心:只需設置默認光標可能不夠好,某些組件具有其自己的「默認」或甚至不止一個,這取決於鼠標位置,這使得它很難正確地重置:http://stackoverflow.com/questions/8830642/cursor-icon-does-not-change-after-trigerring-setcursor-method – kleopatra 2012-02-18 10:19:02

+1

我可能是錯誤,但我認爲從doInBackground()方法對gui中的組件進行任何更改都可能導致此類問題。我可能會建議爲SwingWorkerThread類創建一個構造函數,並將遊標代碼放在那裏,以確保它是從事件派發線程完成的。至少這是我過去採取的方法。我們都知道,儘管我們學到的東西有所變化。 – Logan 2012-02-18 14:25:02

+0

@kleopatra感謝您的澄清和鏈接,我不知道這個問題。在邏輯上,我想如果OP希望光標出現在單擊列標題後出現,請加載SwingWorker,然後應該在doInBackground()中設置光標。現在我知道,在你的鏈接中,有一些問題:-) – 2012-02-19 11:03:59

相關問題