package org.matveev.pomodoro4nb.controls; import java.awt.AlphaComposite; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Insets; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.Action; import javax.swing.Icon; import javax.swing.JButton; public class RolloverButton extends JButton { private static final AlphaComposite COMPOSITE = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f); private boolean revalidateBlocked; public RolloverButton() { } public RolloverButton(Icon icon) { super(icon); } public RolloverButton(Action action) { super(action); addMouseListener(new MouseOverHandler()); } @Override public void updateUI() { super.updateUI(); setBorderPainted(false); setRequestFocusEnabled(false); setMargin(new Insets(1, 1, 1, 1)); } @Override public void setEnabled(boolean b) { super.setEnabled(b); setBorderPainted(false); repaint(); } @Override public void setBorderPainted(boolean b) { try { revalidateBlocked = true; super.setBorderPainted(b); setContentAreaFilled(b); } finally { revalidateBlocked = false; } } @Override public void revalidate() { if (!revalidateBlocked) { super.revalidate(); } } @Override public void paint(Graphics g) { if (isEnabled()) { super.paint(g); } else { Graphics2D g2 = (Graphics2D) g; g2.setComposite(COMPOSITE); super.paint(g2); } } class MouseOverHandler extends MouseAdapter { @Override public void mouseEntered(MouseEvent e) { setContentAreaFilled(true); setBorderPainted(isEnabled()); } @Override public void mouseExited(MouseEvent e) { setContentAreaFilled(false); setBorderPainted(false); } } }