非顶级窗口中的非透明JButton背景变得不透明?

时间:2013-08-29 17:07:02

标签: java swing user-interface synth jwindow

在您阅读之前,这里有一些关于问题的澄清:

  1. SSCCE是为Java 7设计的。可以使用sun。*。AWTUtilities使其适应Java 6,但对我来说它在Java 6上的工作方式并不重要。
  2. 断层线 [...] new JDialog(someWindow) 。只需将 更改<{>> {<1}} ,就可以在SSCCE 中修复重影

  3. 为什么不让顶级窗口出现重影?


    预期行为:[...]new JDialog()(见SSCCE) both TL and non-TL windows have translucent background

    如您所见,右侧窗口具有半透明背景(如预期的那样)。

    实际行为:final JDialog d = new JDialog()(见SSCCE) TL window shows translucent background, while non-TL background becomes opaque even after a single repaint

    在这种情况下,右侧窗口具有不透明背景。事实上,由于任何原因(最容易重现,翻转时重绘)需要3-4次重绘,以使背景变得完全不透明。


    SSCCE:

    final JDialog d = new JDialog(f)

    这些是我的问题......

    1. 发生了什么事? 因为,为什么会出现一个自定义绘制的非透明组件的行为,忘记调用super?
    2. 为什么TL窗户没有发生?
    3. 除了不使用非TL窗口外,最简单的解决方法是什么?

2 个答案:

答案 0 :(得分:1)

  

由于任何原因需要3-4次重绘(最容易重现的是翻转重绘),背景变得完全不透明。

查看Backgrounds With Transparency,可以让您对问题有所了解。

我从未玩过Synth,所以我不知道相同的解决方案是否有效。

答案 1 :(得分:0)

  

为什么顶级窗口没有出现重影?

根据Oracle(Java Tutorials):

  

每个顶级容器都有一个内容窗格,一般来说,   包含(直接或间接)可见组件   顶级容器的GUI。

http://docs.oracle.com/javase/tutorial/uiswing/components/toplevel.html

enter image description here

玻璃窗格通常用于拦截顶层容器上发生的输入事件,也可用于绘制多个组件。它不允许透明度。

因此你如何使用

final Graphics g2 = g.create();

如果您在与自己创建图形对象相反的方法中覆盖 javax.swing.JComponent.paintComponent ,则应通过super.g();

来降低透明度。

通过创建上面列出的图形

的单独方法来解决此问题