2015-11-06 36 views
1

嗨我試圖在學校項目的界面上製作碼頭般的效果。當我將鼠標懸停在他們身上時,我只需要幾個按鈕就可以變大,這是我設法實現的。問題在於它會立即發生,而我希望它是原始尺寸和新尺寸之間的緩慢過渡。這是我試圖做的:慢慢增加jButton的大小

public void biggerButton(JButton boton) { 
    Runnable runnable = new Runnable() { 
     @Override 
     public void run() { 
      int i = 0; 
      while (i < 10) { 
       boton.setSize(i + boton.getWidth(), i + boton.getHeight()); 
       try { 
        Thread.sleep(100); 
       } catch (InterruptedException ex) { 
       } 
       i++; 
      } 
     } 
    }; 
    runnable.run(); 
} 

代碼在鼠標進入放置在容器上的按鈕時運行。如果有人能幫我一把,我會非常感激。由於

+1

嘗試重畫窗口並使用線程安全的swing方法:https://docs.oracle.com/javase/tutorial/uiswing/concurrency/ –

+0

所以,基本上,你想要做的是***動畫* **(UI組件的大小)。在這種情況下,您目前的方法是基於循環直接以像素爲單位增加大小***是錯誤的;因爲不同用戶的系統會以不同的速度運行,導致動畫不一致;因爲有些情況下動畫需要被中斷,甚至在中途反轉,就像你的情況一樣,如果用戶在「增長」動畫結束之前將鼠標移出按鈕。 ***動畫製作的正確方法是使用遊戲開發中使用的*** Delta-Time(#GoogleIt)。 – XenoRo

+0

謝謝,這正是我想要做的。我最終可以通過使用一對庫和動畫來做到這一點 –

回答

1

在你需要把影響事件調度線程上的Swing組件的代碼最低:

while (i < 10) 
    { 
    final int adjustment = i; 
    SwingUtilities.invokeLater(new Runnable() 
      { 
      @Override 
      public void run() 
       { 
       boton.setSize(adjustment + boton.getWidth(), adjustment + boton.getHeight()); 
       } 
      }); 
    } 

如果您使用的是Java 8,lambda表達式使代碼更漂亮:

while (i < 10) 
    { 
    final int adjustment = i; 
    SwingUtilities.invokeLater(() -> 
      { boton.setSize(adjustment + boton.getWidth(), adjustment + boton.getHeight()); } 
    } 

Swing和我一起工作的所有GUI工具包都不是線程安全的,因此只能在事件線程上進行更改。

還要注意,您只增加1個像素,每個步驟共10個像素。這可能不是很明顯。

+0

謝謝你的幫助我做了你提到的調整,我的代碼更好。但我真正想要的是在按鈕每次增加尺寸之間增加一個延遲,如增加1個像素的寬度等待5毫秒,以便給出一些美觀。其實我想要做的就是像這樣的碼頭[鏈接](http://www.yoannkubera.net/realisations/librairies-java/) –