Comment créer un JButton extension avec des coins arrondis?

C'est une continuation de la question "Java arrondie Swing JButton". J'ai cherché une extension de javax.swing.JButton qui va hériter de tout comportement d'exécution et de substituer le dessin des coins.

En utilisant le code donné par noé.w sur soleil page forums le résultat ressemble à ceci:

Comment créer un JButton extension avec des coins arrondis?

J'aimerais être en mesure d'avoir le même dégradé en arrière-plan, sur la souris sur le changement etc. Quelqu'un sait comment faire cela?

Code qui crée le Java Swing fenêtre de l'image est:

public class XrButton extends JButton implements MouseListener {
private static final long serialVersionUID = 9032198251140247116L;
String text;
boolean mouseIn = false;
public XrButton(String s) {
super(s);
text = s;
setBorderPainted(false);
addMouseListener(this);
setContentAreaFilled(false);
}
@Override
public void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
if (getModel().isPressed()) {
g.setColor(g.getColor());
g2.fillRect(3, 3, getWidth() - 6, getHeight() - 6);
}
super.paintComponent(g);
if (mouseIn)
g2.setColor(Color.red);
else
g2.setColor(new Color(128, 0, 128));
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2.setStroke(new BasicStroke(1.2f));
g2.draw(new RoundRectangle2D.Double(1, 1, (getWidth() - 3),
(getHeight() - 3), 12, 8));
g2.setStroke(new BasicStroke(1.5f));
g2.drawLine(4, getHeight() - 3, getWidth() - 4, getHeight() - 3);
g2.dispose();
}
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.getContentPane().setLayout(new FlowLayout());
XrButton xrButton = new XrButton("XrButton");
JButton jButton = new JButton("JButton");
frame.getContentPane().add(xrButton);
frame.getContentPane().add(jButton);
frame.setSize(150, 150);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
public void mouseClicked(MouseEvent e) {
}
public void mouseEntered(MouseEvent e) {
mouseIn = true;
}
public void mouseExited(MouseEvent e) {
mouseIn = false;
}
public void mousePressed(MouseEvent e) {
}
public void mouseReleased(MouseEvent e) {
}
La façon la plus simple pour obtenir le même dégradé/comportement est à chercher dans le jdk source pour que le regard et le sentir. Creuser dans ButtonUI et de ses sous-classes, et voir ce qu'ils font.

OriginalL'auteur Boris Pavlović | 2009-06-17