2015-10-02 38 views
1

我嘗試從位置A移動一個JLabel到B順序在相同的X和Y階梯的位置。該方法可以正常工作,但doesnt't更新我的GUI .. 我給你看我下面的代碼:Java更新圖形用戶界面,而MainThread.join()?

當我不叫。 join()方法,代碼工作,但不要等待執行我的另一個線程...我需要這個函數不會調用它實際運行時..任何人都可以幫助我嗎?

Thread MoveThread = new Thread(new Runnable() 
    { 

     @Override 
     public void run() 
     { 
      for (int i = 0; i<Const.SteinVerschiebenSchritte; i++) 
      { 
       try 
       { 
        p_lblToMove.setLocation(p_lblToMove.getLocation().x + x_schritt, p_lblToMove.getLocation().y + y_schritt); 
        System.out.println("SetLoc"); 
        Thread.sleep(10); 
       } 
       catch (InterruptedException ex) 
       { 
        StatusLog("InterruptedException"); 
       } 
      } 
      System.out.println("invokeLater"); 


      p_lblToMove.setLocation(p_lblToMove.getLocation().x + x_offset, p_lblToMove.getLocation().y + y_offset); 
     } 
    }); 



    MoveThread.start(); 
    try { 
     System.out.println("BeforeJoin"); 
     MoveThread.join(); 
     System.out.println("AfterJoin"); 
     System.out.println("------------------"); 
    } catch (InterruptedException ex) { 
     Logger.getLogger(Spielfeld.class.getName()).log(Level.SEVERE, null, ex); 
    } 
+0

*「他的方法工作正常,但不會更新我的GUI ..」*這是一個奇怪的定義'工作正常'.. –

回答

2

Swing是一個單線程的環境中,這意味着你不應該執行任何長時間運行或事件的背景下,從阻塞操作調度線程,同樣,你的動作也沒有線程安全的,這意味着你應該只從Event Dispatching Thread的上下文中更新UI。

有關更多詳細信息,請參見Concurrency in Swing

取決於你想實現你可以使用一個SwingWorker,看到Worker Threads and SwingWorker瞭解更多詳情,或搖擺Timer,看到How to use Swing Timers更多細節

還記得什麼,鞦韆依賴於佈局管理器做多當談到位置和尺寸部件的核心工作,你可能會發現,你的戰鬥佈局經理可能導致意想不到的結果

當然,你總是可以看看The Universal Tween EngineSliding layoutJava: Moving jLabel twice using Timer

+0

我試過使用SwingUtilities,但它不工作..是否有可能MoveThread 。加入();在這種情況下是錯誤的? – maabaa

+0

*「MoveThread.join(); ist在這種情況下可能是錯誤的嗎?*」 - 最有可能的。我並沒有說要使用'SwingUtilities',我說要麼使用'SwingWorker'或Swing' Timer'(或者更好的方法是用第三方庫來做你想做的事情) – MadProgrammer