【问题标题】:java swing transparency issues under linuxlinux下java swing透明度问题
【发布时间】:2014-07-23 17:38:31
【问题描述】:

我很想在 Ubuntu 14.04 下让 swing 组件透明度正常工作。例如,如果我使用SwingJD library,则有光泽的按钮在 Windows 和 OSX 下可以正确渲染,但有些(不是全部 - 我已经检查了源代码,但无法弄清楚正确渲染的按钮和那些失败的)在 Ubuntu 14.04 下不能正确渲染。我也尝试过让 JToolBar 等组件变成半透明但无济于事。我知道 Swing 和 Linux 在透明度方面存在问题,并且我已经尝试了here、here、here 和 here 给出的解决方案,但没有成功。有没有人找到解决这个问题的方法?我不想只为 Linux 用户创建一个不太美观的 UI。

here's a direct link 到 SwingJD 源 jar,如果您想自己重新创建问题。它带有一个测试类,该类有一个 main 方法,该方法将呈现三个按钮,其中两个在 Ubuntu 下无法正确呈现。

EDIT>> SwingJD 的构造函数

“STANDARD_ORANGE_THEME”有效,而“STANDARD_LIGHT_ORANGE_THEME”无效

    case Theme.STANDARD_ORANGE_THEME:
        buttonColor = new GradientPaint(0, 0, new Color(251, 139, 62), 0,
                height, new Color(255, 102, 0));
        button.setForeground(Color.WHITE);
        break;
    case Theme.STANDARD_LIGHTORANGE_THEME:
        buttonColor = new GradientPaint(0, 0, new Color(247, 174, 24), 0,
                height, new Color(255, 133, 0));
        button.setForeground(Color.WHITE);
        break;

【问题讨论】:

    标签: java linux swing ubuntu transparent


    【解决方案1】:

    并非每个平台都支持透明度。我一直在根本不支持透明窗口或组件的 Linux 系统上工作。对于无法访问图形硬件的虚拟桌面尤其如此。

    您可以尝试isWindowTranslucencySupported() 函数来亲自查看您的系统是否支持透明度。

    来自the tutorial on transparency:

    import static java.awt.GraphicsDevice.WindowTranslucency.*;
    
    // Determine what the default GraphicsDevice can support.
    GraphicsEnvironment ge =
        GraphicsEnvironment.getLocalGraphicsEnvironment();
    GraphicsDevice gd = ge.getDefaultScreenDevice();
    
    boolean isUniformTranslucencySupported =
        gd.isWindowTranslucencySupported(TRANSLUCENT);
    boolean isPerPixelTranslucencySupported =
        gd.isWindowTranslucencySupported(PERPIXEL_TRANSLUCENT);
    boolean isShapedWindowSupported =
        gd.isWindowTranslucencySupported(PERPIXEL_TRANSPARENT);
    

    【讨论】:

    • 感谢您的快速回复!因为 SwingJD GlossyButtons 的一个子集渲染得非常好,所以显然支持某种透明度。能做和不能做的唯一区别是颜色。例如,橙色光泽按钮将呈现,但石灰按钮不会。在源代码中,唯一的区别是使用的颜色和 alpha 值。
    • 那么,您系统上的上述方法返回了哪些值?如果没有看到MCVE,将很难帮助您进行调试。可能是某些组件“伪造”透明度或其他东西。但这只是一个猜测,直到我们看到 MCVE。
    • MCVE 是我链接的jar 文件,不是吗?你想让我删掉一个代码sn-p吗?我想你宁愿在上下文中查看代码,但我可以删除上述按钮的构造函数
    • 您是否阅读了 MCVE 文章的链接?人们不想浏览整个项目或下载整个 jar,只是为了帮助您调试问题。该过程的一部分是将问题缩小到一个小例子。这不仅仅是一个代码 sn-p,因为我们应该能够复制和粘贴它并在没有任何其他资源的情况下运行它。这是一个非常标准的 StackOverflow(和其他地方)问题先决条件。
    • 它已经归结为证明问题的最低要求。这是一个制作按钮的小型图书馆。实际上,您所要做的就是下载、编译和执行。此外,它以这样的方式连接在一起,以至于您无法真正拉出一个小到足以在 SO 文本字段中 git 的子集,该文本字段实际上显示了您下载该 jar 的问题。但是,我会为您剪切和粘贴构造函数。
    【解决方案2】:

    据我所知,我的问题“是否有解决方法”的答案是否定的。 Java 错误数据库中有许多与此类问题有关的错误。 this report in particular 声明如下:

    6794764 的修复删除了对 setDoubleBiffered(false) 的调用 Window.setLayeresOpaque() 私有方法中的方法。更早的 玻璃窗格、根窗格和 框架变为非透明时的内容窗格。双缓冲时 已启用,绘画执行不正确,因此需要 关闭该功能。然而,这主要是在 由于 XToolkit 的一些问题,MS Windows 平台 非透明窗口的实现。

    目前已修复与工具包相关的问题。然而,透明 X11 上的窗口无法正常工作。如果有人恢复对 setLayeresOpaque() 方法中的 setDoubleBuffered() 方法,然后 windows 在 X11 上开始显示 OK。

    6683775 的修复似乎无法修复双缓冲 完全问题。

    至于为什么这只能在 X11 上重现:很可能是因为, 与 WToolkit 不同,XToolkit.needUpdateWindow() 返回 false。 这稍微改变了 RepaintManager 类中的逻辑(并且, 也许,Swing 中的一些其他类),从而使这幅画有点 不同。

    由于 AWT 没有显式依赖双缓冲属性 组件中,绘画伪影很可能是由 摇摆绘画代码。该错误被重新分配给 Swing 以供进一步使用 评估。

    and this one 声明:

    请注意,在修复错误 6848852 之前,测试是不可行的 X11 上的透明度,因为它根本不起作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-29
      • 2013-01-24
      • 2013-06-21
      • 2011-07-08
      相关资源
      最近更新 更多