2013-04-12 53 views
0

我試圖在JavaBean中實現Fish Eye Image Menu。首先,我創建了一個JLabel並將此代碼放在mouseEntered事件中。但是當我運行這個時,輸出不穩定,不能重新調整JLabel的大小。JLabel上的魚眼效果

這是我的代碼。

new Thread() { 
    public void run() { 
    for (int i = 0; i < 30; i++) { 
     int x = imgLabel.getWidth()+1; 
     int y = imgLabel.getHeight()+1; 
     imgLabel.setSize(x , y); 

     // sets the icon to the label 
     imgLabel.setIcon(new ImageIcon(new ImageIcon(getClass().getResource("/pics/icon.png")).getImage().getScaledInstance(x , y, Image.SCALE_DEFAULT))); 
     repaint(); 
     try { 
     Thread.sleep(10); 
     } catch (InterruptedException ex) { 
     ex.printStackTrace(); 
     } 
    } 
    } 
}.start(); 

如果我將該圖像設置爲JLabel的那一行,標籤會完全重新調整大小。
哪裏出錯了?

+1

爲了更快提供更好的幫助,請發佈[SSCCE](http://sscce.org/)。 –

+3

順便說一句 - 如果代碼行混亂起作用,我會更驚訝,而不是失敗。 1)[不要調用setSize(..)](http://stackoverflow.com/questions/7229226/should-i-avoid-the-use-of-setpreferredmaximumminimumsize-methods-in-java-swi)2)在EDT上更新GUI。 3)不要睡在EDT上。有關更多詳細信息,請參見[Swing中的併發](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/)。 –

+0

我知道這是一個混亂的代碼,因爲我想不出另一種方式。無論如何,非常感謝您提供的評論和鏈接。這是一個很大的幫助。 –

回答

1

問題是getScaledInstance()與資源加載一起很慢。做一次這些計算並緩存它們(以30個項目的數組)。並非每次都在for循環中。

另一件事:確保您的動畫使用Swingworker,這有助於確定時間並避免在Event Dispatch Thread(EDT)之外設置圖標。

+0

非常感謝評論。我想我必須在這些東西上學到更多東西。 @bluevoid:謝謝你的提示。我會嘗試的。 –

+0

即使我使用SwingWorker,我也必須重新調整圖像的大小。那麼有沒有什麼辦法可以做到這一點呢?我的意思是,重新調整圖像的大小作爲動畫。 –

+1

「一次執行這些計算並緩存它們(以30個項目的數組)」在啓動時執行此操作 – bluevoid