Swing JButton with customized look

In diesem Artikel möchte ich euch zeigen, wie einfach ihr das „Look and Feel“ eines JButtons nach eurem Geschmack anpassen könnt.

Eine sehr komfortable Lösung ist es, sich hierbei auf die Klasse BasicButtonUI abzustützen. Ich habe dazu eine Klasse implementiert, in der ich die Möglichkeit habe die Schriftart, Farben sowie Icons selbst zu bestimmen.

Diese Klasse erbt von BasicButtonUI und implementiert außerdem bereits einen MouseListener, welcher automatisch an dem Button registriert wird. Das An- und Abmelden des MouseListener geschieht in den überschriebenen Methoden installUI und uninstallUI. Das Setzen der Schriftart, Farben und Icons habe ich in die Methode installDefaults gepackt. Das hat den Vorteil, dass der Methode installDefaults der AbstracteButton übergeben wird und man sich somit das Casten von JComponent auf JButton in installUI sparen kann.

Wie ist diese Klasse implementiert?

public class CustomizedButtonUI 
        extends BasicButtonUI 
        implements MouseListener
{
    private Color     hoverColor   = new Color(240, 240, 240);
    private Color     normalColor  = new Color(240, 240, 240);
    private Color     pressedColor = new Color(240, 240, 240);
    private Color     btnFontColor;
    private ImageIcon normalIcon;
    private ImageIcon hoverIcon;
    private ImageIcon pressedIcon;
    private Font      btnFont;

    public CustomizedButtonUI() {
        super();
    }

    public CustomizedButtonUI(Color normalColor, Color hoverColor, Color pressedColor) {
        this(normalColor, hoverColor, pressedColor, null, Color.BLACK);
    }
    public CustomizedButtonUI(Color normalColor, Color hoverColor, Color pressedColor, Font btnFont, Color btnFontColor) {
        this.normalColor = normalColor;
        this.hoverColor = hoverColor;
        this.pressedColor = pressedColor;
        this.btnFont = btnFont;
        this.btnFontColor = btnFontColor;
    }
    
    public CustomizedButtonUI(ImageIcon normalIcon, ImageIcon hoverIcon, ImageIcon pressedIcon) {
        this(normalIcon, hoverIcon, pressedIcon, null, Color.BLACK);
    }
    public CustomizedButtonUI(ImageIcon normalIcon, ImageIcon hoverIcon, ImageIcon pressedIcon, Font btnFont, Color btnFontColor) {
        this.normalIcon = normalIcon;
        this.hoverIcon = hoverIcon;
        this.pressedIcon = pressedIcon;
        this.btnFont = btnFont;
        this.btnFontColor = btnFontColor;
    }

    @Override
    public void installUI(JComponent comp) {
        super.installUI(comp);
        comp.addMouseListener(this);
    }

    @Override
    public void uninstallUI(JComponent comp) {
        super.uninstallUI(comp); 
        comp.removeMouseListener(this);
    }

    @Override
    protected void installDefaults(AbstractButton btn) {
        super.installDefaults(btn);
        btn.setIcon(this.normalIcon);
        btn.setBackground(this.normalColor);
        btn.setForeground(this.btnFontColor);
        btn.setFont(this.btnFont);
        btn.setHorizontalTextPosition(SwingConstants.CENTER);
    }

    @Override
    public Dimension getPreferredSize(JComponent comp) {
        Dimension dim = super.getPreferredSize(comp);
        if(comp.getBorder() != null){
            Insets insets = comp.getBorder().getBorderInsets(comp);
            dim.setSize(dim.width + insets.left + insets.right, dim.height + insets.top + insets.bottom);
        }
        return dim;
    }
    
    @Override
  public void mouseClicked(MouseEvent e)
  {
    changeButtonStyle((JButton) e.getComponent(), this.pressedColor, this.pressedIcon);
  }

  @Override
  public void mousePressed(MouseEvent e)
  {
    changeButtonStyle((JButton) e.getComponent(), this.pressedColor, this.pressedIcon);
  }

  @Override
  public void mouseReleased(MouseEvent e)
  {
    changeButtonStyle((JButton)e.getComponent(), this.normalColor, this.normalIcon);
  }

  @Override
  public void mouseEntered(MouseEvent e)
  {
    changeButtonStyle((JButton) e.getComponent(), this.hoverColor, this.hoverIcon);
  }

  @Override
  public void mouseExited(MouseEvent e)
  {
    changeButtonStyle((JButton)e.getComponent(), this.normalColor, this.normalIcon);
  }
  
  private void changeButtonStyle(JButton btn, Color color, ImageIcon icon){
      btn.setBackground(color);
      btn.setIcon(icon);
  }
}

Wie kann ich diese Klasse verwenden?

JButton btn = new JButton("codelife.de");
btn.setUI(new CustomizedButtonUI(Color.RED, Color.ORANGE, Color.GREEN));

 

normalHoveredPressed

Wie sich dieser Button verhält, könnt ihr auf dem oberen Bild sehen.

 

Beispielprojekt

 

customizedJButtonPreview

Das komplette Projekt könnt ihr euch hier herunterladen. Viel Spaß damit…

Swing JButton with customized look
Markiert in:                 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.