使用Java圆角Swing JButton

Jos*_*eal 16 java swing jbutton

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

保存此按钮的JComponent具有自定义背景,因此按钮确实只需显示图像.

搜索谷歌后,我无法做到这一点.我已经尝试了以下所有,但没有运气:

button.setBorderPainted(false);
button.setContentAreaFilled(false);
button.setOpaque(true);
Run Code Online (Sandbox Code Playgroud)

在我在背景上绘制图标后,按钮会绘制它,但是会保留带边框的丑陋灰色背景等.我还尝试使用JLabel和JButton.并在其上绘制ImageIcon,但如果用户调整窗口大小或最小化窗口,图标就会消失!

我怎样才能解决这个问题?

我只需要将图像绘制并舍入到JComponent并听取它的点击次数......

Lal*_*and 17

创建一个新的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);
Run Code Online (Sandbox Code Playgroud)

在为JButton设置边框时,调用重写的javax.swing.border.Border类.

addBtn.setBorder(new RoundedBorder(10));
Run Code Online (Sandbox Code Playgroud)

这是班级

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @UVM这几乎是一个有用的评论.要详细说明为什么它"几乎正确"? (6认同)
  • 可能是因为矩形背景在较大半径下可见 (4认同)

Von*_*onC 12

你试过以下吗?

button.setOpaque(false);
button.setFocusPainted(false);
button.setBorderPainted(false);
button.setContentAreaFilled(false);
setBorder(BorderFactory.createEmptyBorder(0,0,0,0)); // Especially important
Run Code Online (Sandbox Code Playgroud)

setBorder(null)可能会有效,但Sun描述的一个错误解释说,除非客户端设置一个不实现UIResource接口的非空边框,否则UI会在组件上设置边框.

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


Bom*_*mbe 0

不透明度应设置为 false,因此

button.setOpaque(false);
Run Code Online (Sandbox Code Playgroud)

可能已经是你想要的了。