簡體   English   中英

如何在Java中使輕型的Swing或AWT組件透明

[英]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,您將明白我的意思。 與打開或關閉背景無關。 嗯,這並不完全正確-默認情況下, JComponentopaque屬性進行了一些巧妙處理,以便在適當的情況下自動繪制背景,但是,如果您要處理自己的繪畫,那么這種巧妙處理可能會被覆蓋。

編輯:關於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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM