Creating custom JButton from images containing transparent pixels

前端 未结 6 552
悲哀的现实
悲哀的现实 2020-12-02 00:46

Read edit 2 for what I\'m actually missing to make it work

I\'m currently trying to create some custom JButtons using images created in photoshop that have an

6条回答
  •  [愿得一人]
    2020-12-02 01:01

    If you want to have shape-specific click points, you're better off using Shape and their contains method. If you want, you can create a shape when creating your custom button class as part of it, and implement a contains method by wrapping around the shape's contains method.

    As for the custom JButton, create a class that extends JButton, like this:

    import java.awt.*;
    import javax.swing.*;
    
    public class CustomButton extends JButton{
    
        /** Filename of the image to be used as the button's icon. */
        private String fileName;
        /** The width of the button */
        private int width;
        /** The height of the button. */
        private int height;
    
     public CustomButton(String fileName, int width, int height){
        this.fileName = fileName;
        this.width = width;
        this.height = height;
        createButton();
    }
    
    /**
     * Creates the button according to the fields set by the constructor.
     */
    private void createButton(){
        this.setIcon(getImageIcon(filename));
        this.setPreferredSize(new Dimension(width, height));
        this.setMaximumSize(new Dimension(width, height));
        this.setFocusPainted(false);
        this.setRolloverEnabled(false);
        this.setOpaque(false);
        this.setContentAreaFilled(false);
        this.setBorderPainted(false);
        this.setBorder(BorderFactory.createEmptyBorder(0,0,0,0)); 
      }
    }
    


    Here's how you can load the ImageIcon, if you want to do it like this.

      public ImageIcon getImageIcon(String fileName){
        String imageDirectory = "images/"; //relative to classpath
        URL imgURL = getClass().getResource(imageDirectory + fileName);
        return new ImageIcon(imgURL);
      }
    

    This will give you a button that will at least look like your image. I asked a similar question regarding Image-based events on click, and Shapes helped wonders. I guess it comes down to how complex your button images are. Here's reference anyway:
    How can you detect a mouse-click event on an Image object in Java?

    PS: Maybe look into generating shapes from images, that go around all the pixels that aren't transparent. No idea if this is possible, but it would mean that a button would only be "pressed" if the user clicks on the image part of it. Just a thought.

提交回复
热议问题