Java Swing How to - Extend BasicButtonUI to create custom JButton








Question

We would like to know how to extend BasicButtonUI to create custom JButton.

Answer

/*  w  w  w .ja v  a 2  s.  com*/
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Insets;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

import javax.swing.AbstractButton;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.border.Border;
import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.basic.BasicButtonUI;

public class Main{
    public static void main(String argv[]) {
        JFrame f = new JFrame();
        f.setSize(400, 300);
        f.getContentPane().setLayout(new FlowLayout());

        JPanel p = new JPanel();
        JButton bt1 = new JButton("Click Me");
        bt1.setUI(new MyButtonUI());
        p.add(bt1);
        f.getContentPane().add(p);
        WindowListener wndCloser = new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        };
        f.addWindowListener(wndCloser);
        f.setVisible(true);
    }
}

class MyButtonUI extends BasicButtonUI implements java.io.Serializable,
        MouseListener, KeyListener {

    private final static MyButtonUI m_buttonUI = new MyButtonUI();

    protected Border m_borderRaised = UIManager.getBorder("Button.border");

    protected Border m_borderLowered = UIManager
            .getBorder("Button.borderPressed");

    protected Color m_backgroundNormal = UIManager
            .getColor("Button.background");

    protected Color m_backgroundPressed = UIManager
            .getColor("Button.pressedBackground");

    protected Color m_foregroundNormal = UIManager
            .getColor("Button.foreground");

    protected Color m_foregroundActive = UIManager
            .getColor("Button.activeForeground");

    protected Color m_focusBorder = UIManager.getColor("Button.focusBorder");

    public static ComponentUI createUI(JComponent c) {
        return m_buttonUI;
    }

    public void installUI(JComponent c) {
        super.installUI(c);

        c.addMouseListener(this);
        c.addKeyListener(this);
    }

    public void uninstallUI(JComponent c) {
        super.uninstallUI(c);
        c.removeMouseListener(this);
        c.removeKeyListener(this);
    }

    public void paint(Graphics g, JComponent c) {
        AbstractButton b = (AbstractButton) c;
        Dimension d = b.getSize();

        g.setFont(c.getFont());
        FontMetrics fm = g.getFontMetrics();

        g.setColor(b.getForeground());
        String caption = b.getText();
        int x = (d.width - fm.stringWidth(caption)) / 2;
        int y = (d.height + fm.getAscent()) / 2;
        g.drawString(caption, x, y);

    }

    public Dimension getPreferredSize(JComponent c) {
        Dimension d = super.getPreferredSize(c);
        if (m_borderRaised != null) {
            Insets ins = m_borderRaised.getBorderInsets(c);
            d.setSize(d.width + ins.left + ins.right, d.height + ins.top
                    + ins.bottom);
        }
        return d;
    }

    public void mouseClicked(MouseEvent e) {
    }

    public void mousePressed(MouseEvent e) {
        JComponent c = (JComponent) e.getComponent();
        c.setBorder(m_borderLowered);
        c.setBackground(m_backgroundPressed);
    }

    public void mouseReleased(MouseEvent e) {
        JComponent c = (JComponent) e.getComponent();
        c.setBorder(m_borderRaised);
        c.setBackground(m_backgroundNormal);
    }

    public void mouseEntered(MouseEvent e) {
        JComponent c = (JComponent) e.getComponent();
        c.setForeground(m_foregroundActive);
        c.repaint();
    }

    public void mouseExited(MouseEvent e) {
        JComponent c = (JComponent) e.getComponent();
        c.setForeground(m_foregroundNormal);
        c.repaint();
    }

    public void keyTyped(KeyEvent e) {
    }

    public void keyPressed(KeyEvent e) {
        int code = e.getKeyCode();
        if (code == KeyEvent.VK_ENTER || code == KeyEvent.VK_SPACE) {
            JComponent c = (JComponent) e.getComponent();
            c.setBorder(m_borderLowered);
            c.setBackground(m_backgroundPressed);
        }
    }

    public void keyReleased(KeyEvent e) {
        int code = e.getKeyCode();
        if (code == KeyEvent.VK_ENTER || code == KeyEvent.VK_SPACE) {
            JComponent c = (JComponent) e.getComponent();
            c.setBorder(m_borderRaised);
            c.setBackground(m_backgroundNormal);
        }
    }


}