2015-10-10 49 views
0

好了,所以我有一個空的佈局JPanel在一個單一JLabelJLabel位於(0,0)。我正在試圖做的是使用while循環在新Thread睡新Thread,然後使用SwingUtilities.invokeLater轉移JLabel 10px的下降。問題在於用戶界面以較差的方式進行更新。它不會每次都更新它,但會跳過大量更新並以大塊進行轉換。我知道我可以用Timer輕鬆完成,但重點是更好地理解Threads。提前致謝!如何實現一個平穩下降的JLabel不使用定時器,但是線程而不是

代碼:

private void start(){ 
    Updater up = new Updater(); 
    up.start(); 
} 
public void updatePosition(){ 
    int y = label1.getLocation.y; 
    label.setBounds(0,y+10, 10,10); 
} 
private class Updater extends Thread{ 
    public void run(){ 
     while(!shouldQuit){ 
      try{ 
       Updater.sleep(100); 
       SwingUtilities.invokeLater(new Runnable() { 
        public void run() { 
         updatePosition(); 
        } 
       }); 
      }catch(Exception e){ 
       System.out.println(e); 
      }  
     } 
    } 
} 

編輯: 我得到它通過與呼叫更換while循環到一個新的線程實例在updatePosition()方法來工作,定居下來一點。而且,這不僅是導致問題的線程,所以我不得不迫使面板通過調用revalidate()來重新佈局它的子視圖。 這裏是它的外觀(全工作之一):

private void start(){ 
    new Updater().start(); 
} 
public void updatePosition(){ 
    int y = label1.getLocation.y; 
    label.setBounds(0,y+10, 10,10); 
    panel.revalidate(); 
    if(!shouldQuit) new Updater().start(); 
} 
private class Updater extends Thread{ 
    public void run(){ 
     try{ 
      Updater.sleep(100); 
      SwingUtilities.invokeLater(new Runnable() { 
       public void run() { 
        updatePosition(); 
       } 
      }); 
     }catch(Exception e){ 
      System.out.println(e); 
     } 
    } 
} 
+0

*「如何實現一個平穩下降的JLabel不使用定時器,但是線程而不是」 *爲什麼「不定時」?爲什麼不在自定義的繪製面板中這樣做,而不是試圖在飛行中定位組件? –

+0

計時器基於線程,所以我認爲應該有辦法做到這一點,這只是一個問題,我不知道解決方案,所以這使得它值得解決。你會如何建議我在一個自定義的彩色面板中進行操作? – vejmartin

+1

*「你怎麼會建議我做一個定製的彩繪面板?」 *很像[此動畫(http://stackoverflow.com/a/14575043/418556),但繪畫字符串,而不是形狀。實際上(檢查)使用'BufferedImage'而不是自定義面板。但是一旦你擁有一個'Graphics'實例,它就是同一個主體。 –

回答

0

你應該嘗試使用的知名度和網格佈局,最大限度的運動。您可以使用int var來計算線程並將其交給標籤。同樣,你應該使用自己的能力創建更新,更多更流暢。剛做的start()mwthod而曳線程:-)

你可以有除了無邊調用的東西開始。我想你已經失去了班上的繼承權。對象label1必須在戰鬥中消失。如果那不是,那麼我很確定我真的不能回答這個問題。

相關問題