Search code examples
javamultithreadingswinghoverjlabel

Fish Eye effect on a JLabel


I am trying to implement a Fish Eye Image Menu in a JavaBean. As a start, I created a JLabel and put this code on the mouseEntered event. But when I run this, the output is shaky and doesn't re-size the JLabel.

This is my code.

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();

If I comment that line where I set the image to the JLabel, the label gets re-sized perfectly.
Where has this gone wrong?


Solution

  • The problem is that getScaledInstance() together with resource loading is slow. Do these calculations once and cache them (in an array of 30 items). Not every time in the for loop.

    Another thing: make sure you use a Swingworker for your animation, that helps in the timing and avoids setting icons outside the Event Dispatch Thread (EDT).