[英]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.