半透明的JFrame边框

Jay*_*ley 4 java user-interface swing border translucency

我想让JFrame边框透明,所以我试图使用我自己的Border类...

private class ShadowBorder extends AbstractBorder {

    private static final int RADIUS = 30;

    @Override
    public boolean isBorderOpaque() {
        return false;
    }

    @Override
    public Insets getBorderInsets(Component c) {
        return new Insets(RADIUS, RADIUS, RADIUS, RADIUS);
    }

    @Override
    public Insets getBorderInsets(Component c, Insets insets) {
        insets.top = RADIUS;
        insets.left = RADIUS;
        insets.bottom = RADIUS;
        insets.right = RADIUS;
        return insets;
    }

    @Override
    public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {
            Graphics2D g2d = (Graphics2D) g.create();
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                                 RenderingHints.VALUE_ANTIALIAS_ON);
            g2d.setColor(new Color(0x66000000, true));

            g2d.fillRect(0, 0, width - RADIUS, RADIUS);
        }
}
Run Code Online (Sandbox Code Playgroud)

但边界在决赛中并不透明.边框内还有白色背景,但我不知道为什么(见atach.图片).有任何想法吗?

在此输入图像描述

谢谢!

Mik*_*rin 5

要使用自定义透明边框制作JFrame,您必须首先更改框架的不透明度:

frame.setUndecorated ( true );
AWTUtilities.setWindowOpaque ( frame, false );
Run Code Online (Sandbox Code Playgroud)

之后,您的框架将根本没有任何系统边框和背景,因此您可以绘制透明的东西(例如边框).顺便说一句,你改变边界的组件必须是非透明的,以及组件下的容器,以使框架后面的像素"通过".

在某些情况下,您还可以使整个框架半透明:

AWTUtilities.setWindowOpacity ( frame, 0.5f );
Run Code Online (Sandbox Code Playgroud)

这将使其50%透明(甚至在系统窗口装饰时也能工作).

虽然这些功能仅在Win和Mac OS系统上得到了适当的支持.