Search code examples
javaswingjbuttonpaintcomponent

Paint Swing JButton as disabled


I want to display a normal JButton as disabled, without setting it to setEnabled(false)!

I just want to show that this button is not enabled, but if the user pushs the button it should call the actionlistener as normal.

So what I did is:

import java.awt.Graphics;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class SwingTests {

    private static void createWindow() {
        JFrame frame = new JFrame();
        JPanel panel = new JPanel();

        MyButton button = new MyButton("Press");
        button.setEnabled(false);

        panel.add(button);
        frame.add(panel);
        frame.setSize(200, 200);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                createWindow();
            }
        });
    }
}

class MyButton extends JButton {
    private boolean enabled = false;

    public MyButton(String text) {
        super(text);
        super.setEnabled(true);
    }

    @Override
    protected void paintBorder(Graphics g) {
        if (isEnabled())
            super.paintBorder(g);
        else
            ; // paint disabled button
    }

    @Override
    protected void paintComponent(Graphics g) {
        if (isEnabled())
            super.paintComponent(g);
        else
            ; // paint disabled button
    }

    @Override
    public void setEnabled(boolean b) {
        enabled = b;
    }

    @Override
    public boolean isEnabled() {
        return enabled;
    }
}

I "just" need to know what to write in paintComponent(g) and paintBorder(g).


Solution

  • if it is disabled and a user pushs the button i display an alarm why this button is disabled!

    Add a MouseListener to the button when it is disabled. Then you can handle the mouseClicked() event to display your "alarm".