【发布时间】:2012-01-20 21:05:09
【问题描述】:
前段时间,我尝试实现Swing/AWT组件的半透明方法,刚刚第一次尝试。但是,实施时 UI 表面出现了一些故障。该方法的代码如下:
public static void setTransparency(Component comp, float t)
{
try
{
if (comp instanceof Window)
{
try
{
//For JDK 1.7
((Window) comp).setOpacity(t);
}
catch (Throwable th)
{
System.err.println("JRE may be less than 1.7!");
if (!th.getClass().isInstance(new NoSuchMethodError()))
th.printStackTrace();
try
{
//For JDK 1.6
com.sun.awt.AWTUtilities.setWindowOpacity((Window) comp, t);
}
catch (Throwable th1)
{
throw new UnsupportedOperationException("It seems that transparency is not supported", th1);
}
}
}
else
{
if (comp instanceof JComponent)
((JComponent)comp).setOpaque(false);
Graphics2D g2 = (Graphics2D) comp.getGraphics().create();
g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, t));
comp.paint(g2);
g2.dispose();
}
}
catch (Throwable th)
{
throw new UnsupportedOperationException("Transparency might not be supported", th);
}
}
运行时,组件的外观不会改变。 有没有人建议让 Swing 或 AWT 组件半透明且 100% 可靠?这仅适用于轻量级组件,因为重量级的透明性被单独覆盖并且 100% 可靠,如上所示。 p>
【问题讨论】:
-
设置Window半透明或组件时是否会出现这种情况? JDK 版本是什么?
-
@prunge 正如我在上一句中所说,它只是组件。窗口半透明效果完美。我正在测试 JDK 1.7_1 和 JDK 1.6_29
-
你不只是在寻找 JComponent#setOpaque(false) 吗?您发布的代码毫无意义(尝试将其绘制为透明一次不会持久)
-
@WalterLaan 你知道
JComponent#setOpaque(boolean b)做什么吗?那不是我想要的。我想要整个组件的半透明,而不是背景的开/关。 -
如果背景的任何部分必须显示给您的组件,那么您的组件必须将 opaque 设置为 false。所以是的,这就是你想要的。
标签: java swing awt transparency