![](/img/trans.png)
[英]how to make animation app in java using applet,awt and swing?
[英]How to make a lightweight Swing or AWT component translucent in Java
前一阵子,我尝试为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%可靠。
嗯,您可能想看看JLayer(或<Java 1.7的JXLayer)的透明性。
参见教程
好吧,这是您的第一个问题:
Graphics2D g2 = (Graphics2D) comp.getGraphics().create();
g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, t));
comp.paint(g2);
g2.dispose();
您只能在对paint(Graphics g)
的调用内绘画组件。 在调用setTransparency
方法期间进行绘制是一个坏主意,因为在Swing下次决定调用paint
时,它将被擦除。 您需要使组件在paintComponent
方法内部处理其自身的透明性。
还有这个: if (!th.getClass().isInstance(new NoSuchMethodError()))
你到底在做什么? 简单的catch (NoSuchMethodError e)
什么问题? 或者,如果您真的要使用instanceof,那么th instanceof NoSuchMethodError
吗?
顺便说一下,@ WalterLaan和@JimN知道他们在说什么。 setOpaque
(或更准确地说, isOpaque
)是Swing引擎的呈现提示,可以帮助其优化操作。 检查javadocs,您将明白我的意思。 与打开或关闭背景无关。 嗯,这并不完全正确-默认情况下, JComponent
对opaque
属性进行了一些巧妙处理,以便在适当的情况下自动绘制背景,但是,如果您要处理自己的绘画,那么这种巧妙处理可能会被覆盖。
编辑:关于NoSuchMethodError。 看看这个:
void setTransparency(Window w, double t) {
try {
setOpacity17(w, t);
return;
}
catch (NoSuchMethodError e) {
System.err.println("JRE *is* less than 1.7!"); // We know the JRE must be < 1.7 because the right methods are known to exist in 1.7.
}
catch (Throwable t) {
t.printStackTrace();
}
try {
setOpacity16(w, t);
}
catch (Throwable t) {
System.err.println("Boom!");
}
}
void setOpacity17(Window w, double t) {
...
}
void setOpacity16(Window w, double t) {
...
}
干净很多。 请注意,如果1.7版本成功,则return
将使功能短路。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.