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.图片).有任何想法吗?
谢谢!
要使用自定义透明边框制作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系统上得到了适当的支持.