繁体   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