2013-04-12 54 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