2013-04-04 31 views
0

我正在使用invokeLater()加載位於JTabbedPane內的JPanel內的JEditPane內的HTML頁面。確定invokeLater中的進程何時完成

我所有的方法都可以正常加載html。我遇到麻煩的事情是更新標籤標題。

但是,方法setTitle()和setTabTitle()可以在PageLoader完成之前執行。因此標籤標題總是顯示前一個html頁面的標題。

有沒有一種方法可以讓我從執行,直到調用後已經完成了內螺紋後停止方法的setTitle()和setTabTitle():

這裏是我的代碼我在看的部分:

private void showPage(){ 
    // Load cursors 
    Cursor cursor = viewer.getCursor(); 
    Cursor waitCursor = Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR); 
    viewer.setCursor(waitCursor); 

    SwingUtilities.invokeLater(new PageLoader(viewer, url, cursor)); 

    //Update tab title 
    setTitle(); 
    tabPanel.setTabTitle(this); 

    //Update address bar 
    addressTextField.setText(url.toString()); 


} 

感謝您的任何幫助,你可以給。

+0

只是猜測沒有看到PageLoader:如果是這樣的長時間運行的任務,這是錯的包裹這一切進入一個調用 - 而是啓動一個線程來完成後臺工作,並在該線程中調用invokelater將結果傳遞給EDT。這是更新相關UI屬性的適當位置,如f.i.框架/標籤標題 – kleopatra 2013-04-04 22:16:13

回答

1

setTitle()等放在PageLoader.run()代碼的末尾。您可能需要將this或其他一些變量傳遞給它的構造函數,以便您可以訪問標題。

+0

這會膨脹代碼。不在PageLoader構造函數中,不得不設置標籤標題。這就像在框架構造函數中調用'setVisible()'一樣。 – 2013-04-04 16:40:08

+0

PageLoader構造函數不會設置標題,但是在PageLoader.run()結尾處,它將需要一些引用,以便它可以獲取標題並對其進行設置。儘管我會澄清我的答案 - 謝謝。 – user949300 2013-04-04 17:06:04

+0

如果他調用'setTitle()',它以某種方式。 – 2013-04-04 17:09:38

2
Determining when a process within invokeLater has completed 
  • 可以通過if (SwingUtilities.isEventDispatchThread()) {util.Timer

  • 測試,但這種想法是不好的,爲什麼有理由狩獵EDT結束,

  • EDT在沒有結束在Swing GUI中重繪所有事件的時刻,有通過API實現的通知器的內部處理

  • 基本上你模擬Workers Thread,使用SwingWorkerRunnable#Thread(所有事件visibble桂必須被包裹成的invokeLater)