Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 8015997
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: June 4, 20262026-06-04T20:25:05+00:00 2026-06-04T20:25:05+00:00

for my project, i want to create custom shaped buttons. i’ve got the codes

  • 0

for my project, i want to create custom shaped buttons. i’ve got the codes to create circular buttons, and after much research, i managed to find some codes that i can use to generate a shape(area) from a PNG image with transparency, so that i can use the code and put it into my custom button program. however, the process of creating the shape is cpu-consuming, and it takes quite a long time for creating each shape. Here is my code for generating a shape from an image:

import java.awt.Rectangle;
import java.awt.geom.Area;
import java.awt.image.BufferedImage;

public class CreateShapeClass {
    public static Area createArea(BufferedImage image, int maxTransparency) {
        Area area = new Area();
        Rectangle rectangle = new Rectangle();
        for (int x = 0; x < image.getWidth(); x++) {
            for (int y = 0; y < image.getHeight(); y++) {
                int rgb = image.getRGB(x, y);
                rgb = rgb >>> 24;
                if (rgb >= maxTransparency) {
                    rectangle.setBounds(x, y, 1, 1);
                    area.add(new Area(rectangle));
                }
            }
        }
        return area;
    }
}

by using the code above, there will be a NullPointerException error. here’s the stacktrace:

java.lang.NullPointerException
at CreateShapeClass.createArea(CreateShapeClass.java:10)
at CustomButton.initShape(CustomButton.java:95)
at CustomButton.paintBorder(CustomButton.java:102)
at javax.swing.JComponent.printBorder(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JComponent.print(Unknown Source)
at javax.swing.JComponent.paintChildren(Unknown Source)
at javax.swing.JComponent.printChildren(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JComponent.print(Unknown Source)
at javax.swing.JComponent.paintChildren(Unknown Source)
at javax.swing.JComponent.printChildren(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JLayeredPane.paint(Unknown Source)
at javax.swing.JComponent.print(Unknown Source)
at javax.swing.JComponent.paintChildren(Unknown Source)
at javax.swing.JComponent.printChildren(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JComponent.print(Unknown Source)
at java.awt.GraphicsCallback$PrintCallback.run(Unknown Source)
at sun.awt.SunGraphicsCallback.runOneComponent(Unknown Source)
at sun.awt.SunGraphicsCallback.runComponents(Unknown Source)

here is my CustomButtonClass:

import java.awt.*;
import java.awt.geom.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.Iterator;

import javax.imageio.ImageIO;
import javax.imageio.ImageReadParam;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;
import javax.swing.*;

public class CustomButton extends JButton {
    protected Shape shape, base;
    protected BufferedImage image;
    protected String imagePath;

    private static final long serialVersionUID = 1L;
    public CustomButton() {
        this(null, null);
    }
    //takes in an icon
    public CustomButton(Icon icon) {
        this(null, icon);
    }
    //takes in a text string for button
    public CustomButton(String text) {
        this(text, null);
    }

    //takes in a text string for button
    public CustomButton(Icon icon, String imagePath, boolean useless) {
        this(null, icon);
        this.imagePath = imagePath;
    }
    //takes in an action for the button press event
    public CustomButton(Action a) {
        this();
        setAction(a);
    }
    //takes in text and icon image
    public CustomButton(String text, Icon icon) {
        setModel(new DefaultButtonModel());
        init(text, icon);
        if(icon==null) {
            return;
        }
        setBorder(BorderFactory.createEmptyBorder(0,0,0,0));
        setBackground(Color.BLACK);
        setContentAreaFilled(false);
        setFocusPainted(false);
        //setVerticalAlignment(SwingConstants.TOP);
        setAlignmentY(Component.TOP_ALIGNMENT);
        initShape();
    }

    //creates a method for retrieving preferred size of the button (the image)
    @Override public Dimension getPreferredSize() {
        Icon icon = getIcon();
        Insets i = getInsets();
        if (icon == null){
            return super.getPreferredSize();
        }
        else {
            return new Dimension(icon.getIconWidth(), icon.getIconHeight());
        }
    }

    //creates the shape of the button from the image
    protected void initShape() {
        if(!getBounds().equals(base)) {
            Dimension s = getPreferredSize();
            base = getBounds();
            if (image == null){
                try {
                    image = ImageIO.read(new File("Untitled1.png"));
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            shape = CreateShapeClass.createArea(image, 25);
            System.out.println(shape.getBounds());
        }
    }

    //creates the border of the button
    @Override protected void paintBorder(Graphics g) {
        initShape();
        Graphics2D g2 = (Graphics2D)g;
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2.setColor(getBackground());
        g2.setStroke(new BasicStroke(1.0f));
        g2.draw(shape);
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);
    }
    @Override public boolean contains(int x, int y) {
        initShape();
        return shape.contains(x, y);
    }
}

so, can anyone guide me on where did i go wrong with the code? and is there any way that the shape generated can be saved into some sort of files so that it does not have to always regenerate the shape whenever the program is being run? or is there any way to precache the shape.

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-06-04T20:25:07+00:00Added an answer on June 4, 2026 at 8:25 pm

    You have no check if the image parameter is null. Looking at your calling method initShape you can get a null pointer if the “Untitled1.png” cannot be read.

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I create an Android project for build my custom widget, and I want to
I can't find IPasswordProvider interface in my WSE project. I want to create a
I want to create an InstallShield Project that has a custom dialog containing a
I want to create a custom project template with wizard i.e. when I create
I created one GWT webapplication project.Inthat i want to create servlet program,but in that
I want to create a simple web project app. I am using struts2 and
I want to create maven multi module project, but it should not like normal
I want to create a JPA project in Eclipse but at the same time
I want to create a project that uses source files already on my filesystem,
I want to create a vb.net project that I will use to only hold

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.