如何在Java中制作圆形JButtons

4
首先,我是一名网页开发者和初学Java程序员。 我的老板要求我在一个应用程序中制作这个按钮: enter image description here 我的自定义按钮类必须扩展JButton或BasicButtonUI以便可以被重用。
我在Stack Overflow上进行了一些研究,但由于老板时间的限制,我并没有理解答案。

7
这是一个介绍如何制作圆角JButton的Java Swing小技巧的博客文章。它展示了使用Graphics2D类和Shape接口来定制Swing组件外观的代码示例。该博客文章还提供了完整的源代码和演示图像。 - Madhawa Priyashantha
3
首先,我是一名网络开发者。在没有充分的研究之前,不知道是谁点赞了这个问题。这里并不需要任何图形,只需边框并覆盖来自ButtonModel的事件。 - mKorbel
1
什么...谁点赞了这个? :D 你确定这里没有适合你的东西吗?(http://stackoverflow.com/search?q=round+jbutton)请记住,StackOverflow不是为你完成工作的地方。请提供你已经尝试过的大纲和你卡住的地方。同时,请尽量提供为什么你想扩展JButton的原因,不要强求,事情不会在这里匆忙完成。 - avalancha
可能是重复的问题:如何制作圆形按钮 - avalancha
你可以查看https://dev59.com/q1TTa4cB1Zd3GeqPuq5Z#31699716。 - Tell Me How
4个回答

15
您应该创建自己的组件来实现此功能。 在JPanel上覆盖`paintComponent`方法,在`paintComponent`方法内部绘制(即填充)一个灰色的roundRectangle2D:
RoundRectangle2D roundedRectangle = new RoundRectangle2D.Float(x, y, w, h, 10, 10);
g.fill(roundedRectangle);

(The last two values determine the curvature. Play around until you get what you want)
现在移动x,y并减小widthheight,以便在绘制下一个矩形时,它位于灰色矩形内部。将图形颜色设置为蓝色,然后执行以下操作:
RoundRectangle2D roundedRectangle2 = new RoundRectangle2D.Float(x + 5, y + 5, w - 10, h - 10, 10, 10);
g.fill(roundedRectangle2);

你还需要添加文本。添加文本需要一个x和y位置。确切的x和y位置可能很难计算,因此您可能需要使用FontMetrics获取有关字符串矩形形状的更多信息。Fontmetrics具有像stringWidth()和getHeight()这样的方法,这将帮助您确定x和y应该是什么。
g.drawString("Click Me", x, y);

最后,您需要在面板上添加鼠标移动监听器。监听器需要找到鼠标是否悬停在按钮上,然后重新绘制组件。

您的矩形可以转换为shape对象,并可以计算出鼠标是否在该形状内。例如:

shape.contains(x,y)

如果它包含,则更改颜色,然后在面板上调用repaint()updateUI()

注意:你的颜色对象应该作为类级别字段保存在类中,这样可以通过鼠标悬停进行更改。

希望这有所帮助!


请告诉我还有哪些事情,这样我可以让它变得更好。谢谢。 - user3229635
2
你卡在哪个部分了?你尝试重写面板上的drawComponent(..)方法了吗? - Oliver Watkins
同时确保开启抗锯齿,否则看起来很糟糕: g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - Oliver Watkins
是的,我已经做过了。你说你认为你可以做得更好,这就是吗? - user3229635
了不起的人啊,太优秀了。我访问了你的网站,里面的学习资源真是棒极了。很高兴能够认识你,非常感谢! - user3229635
显示剩余5条评论

4
如果您不想使用图形API自己绘制图像,或者由于图像来自平面设计师而无法这样做,则可以将它们用作ImageIcon对象,并使用setRolloverIcon()setIcon()。在这种情况下,我会这样做。
class ButtonRollover {

    private String normalImagePath;
    private String rolloverImagePath;

    public ButtonRollover(String normalImagePath, String rolloverImagePath) {
        this.normalImagePath = normalImagePath;
        this.rolloverImagePath = rolloverImagePath;
    }

    public void apply(AbstractButton abstractButton) {
        abstractButton.setBorderPainted(false);
        abstractButton.setBackground(new Color(0, 0, 0, 0));
        abstractButton.setRolloverIcon(createImageIcon(rolloverImagePath));
        abstractButton.setIcon(createImageIcon(normalImagePath));
    }

    private ImageIcon createImageIcon(String path) {
        java.net.URL imgURL = getClass().getResource(path);
        if (imgURL != null) {
            return new ImageIcon(imgURL);
        } else {
            System.err.println("Couldn't find file: " + path);
            return null;
        }
    }
}

然后使用它。例如。

public class Main extends JFrame {

    public static void main(String[] args) {
        Main main = new Main();
        main.setBackground(Color.WHITE);
        main.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        main.setSize(640, 480);

        Container contentPane = main.getContentPane();

        ButtonRollover buttonRollover = new ButtonRollover("/bt_normal.png",
                "/bt_hover.png");

        JButton btn = new JButton();
        buttonRollover.apply(btn);

        contentPane.add(btn);
        main.setVisible(true);
    }
}

只需将图像文件放在类路径中即可。


2

有几种方法可以实现。

1)JButton具有内置的API setIcon。您可以在此处设置ImageIcon。

2)您可以添加鼠标监听器(Mouse entered,Mouse exited),将图标更改为所需的图标。

3)制作圆形按钮 - 参考创建曲线按钮。


0
public class Main extends JFrame {

    public static void main(String[] args) {
        Main main = new Main();
        main.setBackground(Color.WHITE);
        main.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        main.setSize(640, 480);

        Container contentPane = main.getContentPane();

        ButtonRollover buttonRollover = new ButtonRollover("/bt_normal.png",
                "/bt_hover.png");

        JButton btn = new JButton();
        buttonRollover.apply(btn);

        contentPane.add(btn);
        main.setVisible(true);
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接