如何在Java中制作圆形JButton

如何在Java中制作圆形JButton,java,swing,jbutton,custom-component,rounded-corners,Java,Swing,Jbutton,Custom Component,Rounded Corners,首先,我是一名Web开发人员和Java程序员新手。 我的老板要求我在应用程序中制作此按钮: 我的自定义按钮类必须扩展JButton或BasicButtonUI,以便可以重用 我对堆栈溢出进行了一些研究,但我不明白答案,特别是由于我老板的时间限制。您应该为此创建自己的组件 覆盖JPanel上的paintComponent方法,并在paintComponent方法内部以灰色绘制(即填充)圆形矩形2D: RoundRectangle2D roundedRectangle = new RoundRec

首先,我是一名Web开发人员和Java程序员新手。 我的老板要求我在应用程序中制作此按钮:

我的自定义按钮类必须扩展
JButton
BasicButtonUI
,以便可以重用


我对堆栈溢出进行了一些研究,但我不明白答案,特别是由于我老板的时间限制。

您应该为此创建自己的组件

覆盖JPanel上的paintComponent方法,并在paintComponent方法内部以灰色绘制(即填充)圆形矩形2D:

RoundRectangle2D roundedRectangle = new RoundRectangle2D.Float(x, y, w, h, 10, 10);
g.fill(roundedRectangle);
(最后两个值决定曲率。在获得所需的曲率之前,请继续玩)

现在移动x,y并减小宽度和高度,以便在绘制下一个矩形时,它位于灰色矩形内。将图形颜色设置为蓝色,然后执行以下操作:

RoundRectangle2D roundedRectangle2 = new RoundRectangle2D.Float(x + 5, y + 5, w - 10, h - 10, 10, 10);
g.fill(roundedRectangle2);
您还需要添加文本。添加文本需要x和y位置。精确的x和y位置可能很难计算,因此您可能需要使用来获取有关字符串矩形形状的更多信息。Fontmetrics有stringWidth()和getHeight()等方法,它们将帮助您确定x和y应该是什么

g.drawString("Click Me", x, y);
最后,您需要在面板上有一个鼠标运动监听器。侦听器需要找到鼠标何时位于按钮上方,然后重新绘制组件

您的矩形可以投射到对象,并且可以计算鼠标是否在该形状中。例如:

shape.contains(x,y)
如果包含,请更改颜色,然后在面板上调用repaint()updateUI()

注意:您的颜色对象应作为类中的类级字段保留,以便可以通过鼠标悬停对其进行更改


希望这有帮助

有很多方法可以做到这一点

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

2) 您可以添加鼠标侦听器(鼠标进入,鼠标退出)将图标更改为所需的图标


3) -请参阅创建曲线按钮。

如果您不想自己使用图形API绘制图像,或者由于图像来自图形设计师,因此无法将其用作对象并使用和

在这种情况下,我会这样做

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

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

首先,我是Web开发人员
-之前的研究很差,不知道是谁对这个问题投了反对票,不需要任何图形,只需边界和覆盖按钮模型中的事件。。。谁投了这个票你确定要记住StackOverflow不是为你完成工作的地方吗。请提供一份你迄今为止尝试过的东西的概要,以及你遇到的困难。另外,试着给出你为什么要扩展JButton的理由,不要急于求成,事情不会仓促完成,这里可能有你的副本可以检查,好吧,让我试试。还有更多的事情我可以补充。但是,如果我的回答还不够,请告诉我。请告诉我还有什么其他的事情,这样我可能会做得更好。谢谢你在哪一部分?您是否尝试过覆盖面板上的drawComponent(..)?还要确保“反Aliasing”处于启用状态,或者它看起来像垃圾:g.setRenderingHint(RenderingHits.KEY\u ANTIALIASING,RenderingHits.VALUE\u ANTIALIAS\u on);
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);
    }
}