Dan
Dan

Reputation: 883

I want to simplify things in my Java program

I made a game using NetBeans design tool, called WordHunt. It looks like this:

enter image description here

I need to make a class that will apply a mouseover effect to those 16 labels I have. This is the code that changes the icon B when enter the mouse:

private void b1MouseEntered(java.awt.event.MouseEvent evt) {                                
        b1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/ip/imag/" +B+ ".png")));

    }                               

I had applied a default icon to the label. After making that class, instead of writing:

b1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/ip/imag/" +B+ ".png")));

to write className(b1 ,B); For the next label, the same thing className(b2 ,C);

Observation: b1 is a label and I have all letters icon in .png format from A to Z.

Can anybody give me an idea of how I can do that?

Upvotes: 3

Views: 636

Answers (5)

Jiji TANG
Jiji TANG

Reputation: 91

If I understand what you want to do, you can use this method:

public void setRolloverIcon(Icon rolloverIcon)

defined in the class JButton to configure the rollover icon.

Just create a simple class like this:

class HoverEffectButton extends JButton{

  HoverEffectButton(Image img1, Image img2) {
    super(new ImageIcon(img1));
    this.setRolloverIcon(new ImageIcon(img2));
  }

}

Hope this will help. And of course you can create a helper class that permits to load an image according to the image name

   class AssetsHelper{
   private static final String DEFAULT_ASSETS_ROOT = "assets/";
   private static final String DEFAULT_IMAGE_SUBFIX = ".png";

   public static Image loadImage(String name){
      BufferedImage img = null;
      try {
        img = ImageIO.read(new File(DEFAULT_ASSETS_ROOT + name + DEFAULT_IMAGE_SUBFIX));
      } catch (IOException e) {
         .... 
      }
      return img;
   }

}

Upvotes: 3

Bernhard Barker
Bernhard Barker

Reputation: 55659

How about something like this: (rough draft)

// for storage so we don't load it for each mouse-over
HashMap<String, ImageIcon> images = new HashMap<String, ImageIcon>();

void setIcon(JLabel button, String image)
{
  if (images.containsKey(image))
    return images.get(image);
  else
  {
    String path = "/ip/imag/" + image + ".png";
    ImageIcon icon = new ImageIcon(getClass().getResource(path));
    images.put(image, icon);
    return icon;
  }
}

And then:

setIcon(b1, "B");

But you should probably consider using buttons so you can use setRolloverIcon rather than MouseEntered.

Upvotes: 1

Joop Eggen
Joop Eggen

Reputation: 109613

public class MyButton extends JButton {
    private ImageIcon normalIcon;
    private ImageIcon hoverIcon;

    public MyButton(String normalURL) {
        String hoverURL = normalURL.replaceFirst("\\.png$", "-hover.png");
        normalIcon = new ImageIcon(getClass().getResource("/ip/imag/" +B+ ".png"); // or so
        hoverICon = ...
    }

    private void b1MouseEntered(MouseEvent evt) {                           
        setIcon(hoverIcon);
    }    
}

Upvotes: 1

Ahyox Prodigy
Ahyox Prodigy

Reputation: 27

if i get u well i think you want just an image and not evry image to chang when mouse is on it right. if that is the case what u should do is to get the position of each image in a buffer and compare it with the mouse x n y position to know wc image to change. I hope this solve your problem

Upvotes: 0

user1646196
user1646196

Reputation: 588

Firstly at the top of your code add this import:

import javax.swing.ImageIcon;
//Then you only need to write
new ImageIcon(...);

Instead of:

new javax.swing.ImageIcon(...)

Already shorter :)

Then you can create a hashmap of the images preloaded where each instance of B is the key and the loaded icon is the value.

Upvotes: 0

Related Questions