使用Java的Rounded Swing JButton

2022-09-02 00:52:28

好吧,我有一个图像,我想把它作为按钮(或可切开的东西)的背景。问题是这个图像是圆形的,所以我需要显示这个图像,没有任何边框等。

持有此按钮的JComponent具有自定义背景,因此该按钮实际上只需要显示图像。

在搜索Google之后,我无法做到这一点。我已经尝试了以下所有方法,但没有运气:

button.setBorderPainted(false);
button.setContentAreaFilled(false);
button.setOpaque(true);

在我在背景上绘制图标后,按钮会绘制它,但具有带有边框的丑陋灰色背景等。我也尝试过使用JLabel和JButton。并在上面绘制一个图像图标,但是如果用户调整窗口大小或最小化窗口,图标就会消失!

我该如何解决这个问题?

我只需要将图像绘制并圆圆到JComponent并收听点击...


答案 1

创建一个新的 Jbutton:

    JButton addBtn = new JButton("+");
    addBtn.setBounds(x_pos, y_pos, 30, 25);
    addBtn.setBorder(new RoundedBorder(10)); //10 is the radius
    addBtn.setForeground(Color.BLUE);

在为 JButton 设置边框时,调用被覆盖的类。javax.swing.border.Border

addBtn.setBorder(new RoundedBorder(10));

这是类

private static class RoundedBorder implements Border {

    private int radius;


    RoundedBorder(int radius) {
        this.radius = radius;
    }


    public Insets getBorderInsets(Component c) {
        return new Insets(this.radius+1, this.radius+1, this.radius+2, this.radius);
    }


    public boolean isBorderOpaque() {
        return true;
    }


    public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {
        g.drawRoundRect(x, y, width-1, height-1, radius, radius);
    }
}

答案 2

您是否尝试过以下方法?

button.setOpaque(false);
button.setFocusPainted(false);
button.setBorderPainted(false);
button.setContentAreaFilled(false);
setBorder(BorderFactory.createEmptyBorder(0,0,0,0)); // Especially important

setBorder(null)可能会起作用,但是在 Sun 中描述了一个错误,说明 UI 在组件上设置边框是设计使然,除非客户端设置不实现接口的非空边框。UIResource

当传入 null 时,JDK 本身不应该将边框设置为 a,而是客户端应该自己设置一个(一个非常简单的解决方法)。这样就不会混淆谁在代码中做了什么。EmptyBorderEmptyBorder


推荐