如何用Java创建Round JButton

时间:2014-09-25 10:14:24

标签: java swing jbutton custom-component rounded-corners

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

enter image description here

我的自定义按钮类必须扩展JButtonBasicButtonUI,以便可以重复使用。

我对Stack Overflow做了一些研究,但我不明白答案,尤其是我老板的时间限制。

4 个答案:

答案 0 :(得分:13)

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

覆盖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来获取有关字符串矩形形状的更多信息。 Fontmetrics有像stringWidth()和getHeight()这样的方法,它们可以帮助你确定x和y应该是什么。

g.drawString("Click Me", x, y);

最后,您需要在面板上安装鼠标移动侦听器。监听器需要找到鼠标何时在按钮上,然后重绘组件。

您的矩形可以转换为shape对象,并且可以计算鼠标是否处于形状中。例如:

shape.contains(x,y)

如果包含,请更改颜色,然后在面板上调用重绘() updateUI()

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

希望这有帮助!

答案 1 :(得分:4)

如果您不想使用图形API自己绘制图像,或者您不能将图像来自图形设计师,那么您可以将它们用作ImageIcon个对象并使用{{3 }和setRolloverIcon()

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

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

而不是使用它。 E.g。

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 :(得分:2)

有办法做到这一点。

1)JButton内置了API setIcon。你可以在这里设置ImageIcon。

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

3)Make a button round - 请参阅创建曲线按钮。

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