如何创建带圆角的JButton扩展?

这是“Java round Swing JButton”问题的延续。 我搜索了javax.swing.JButton的扩展,它将inheritance所有运行时行为并且只是覆盖角的绘制。

在sun论坛页面上使用noah.w提供的代码,结果如下所示:

替代文字http://sofzh.miximages.com/java/107qfkp.png

我希望能够在背景中拥有相同的渐变,鼠标更换等。有人知道如何做到这一点吗?

从图片创建Java Swing窗口的代码是:

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) { } 

我想你在这里有两个选择:

1.使用组件的绘制方法实现绘图

2.为您的外观和风格创建新的ButtonUI。 在这种情况下,我建议使用Synch LAF

在这两种情况下,绘制不同的状态是你的责任

我在Swing中看到的圆形按钮的最佳实现是Substance外观和感觉:

http://sofzh.miximages.com/java/unZuc.png

你必须自己照顾它:

  • 首先,您可以捕获按钮上用于更改状态的各种操作(例如在代码中,其中mouseIn用于更改颜色)
  • 然后你必须关心你需要的每一个油漆细节,例如对于渐变你应该指向用于绘制渐变的GradientPaint类。

顺便说一下,你必须要注意各种外观,并且你的解决方案只适合其中一种。