Jeg så lige titlen på dette spørgsmål, og man kunne jo godt få brug for runde knapper, så det gjorde spørgsmålet lidt interessant.
Jeg mener ikke at jeg har lavet et eksempel før herinde, men om ikke andet, så er her en modificeret udgave af den som findes her
http://java.sun.com/developer/TechTips/1999/tt0826.html som jeg selv synes er væsentlig bedre og som følger default look and feel.
Jeg kan bare ikke finde ud af hvilken farve grænsen har, men det er der måske andre som har lyst til at rode lidt mere med.
Her kommer test klasse og den runde knap!
public class TestButton extends javax.swing.JFrame {
public TestButton() {
initComponents();
}
private void initComponents() {
roundButton1 = new RoundButton();
roundButton2 = new RoundButton("Round");
jButton1 = new javax.swing.JButton();
getContentPane().setLayout(new java.awt.FlowLayout());
addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(java.awt.event.WindowEvent evt) {
exitForm(evt);
}
});
getContentPane().add(roundButton1);
roundButton2.setText("Round");
getContentPane().add(roundButton2);
jButton1.setText("jButton1");
getContentPane().add(jButton1);
pack();
}
private void exitForm(java.awt.event.WindowEvent evt) {
System.exit(0);
}
public static void main(String args[]) {
new TestButton().show();
}
private javax.swing.JButton jButton1;
private RoundButton roundButton1;
private RoundButton roundButton2;
}
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Shape;
import java.awt.geom.Ellipse2D;
import javax.swing.JButton;
public class RoundButton extends JButton {
public RoundButton() {
this("");
}
public RoundButton(String label) {
super(label);
setOpaque(false);
Dimension size = getPreferredSize();
size.width = size.height = Math.max(size.width,
size.height);
setPreferredSize(size);
setContentAreaFilled(true);
}
protected void paintComponent(Graphics g) {
contains(0,0);
g.setClip(shape);
super.paintComponent(g);
}
protected void paintBorder(Graphics g) {
g.setColor(Color.lightGray);
g.drawOval(1, 1, getSize().width-2, getSize().height-2);
if(getModel().isRollover()){
g.setColor(g.getColor().darker());
g.drawOval(2, 2, getSize().width-4, getSize().height-4);
}
}
public boolean contains(int x, int y) {
if (shape == null ||
!shape.getBounds().equals(getBounds())) {
shape = new Ellipse2D.Float(0, 0,
getWidth(), getHeight());
}
return shape.contains(x, y);
}
private Shape shape;
}