改变摇摆窗口的底层背景颜色

时间:2010-05-06 06:47:29

标签: java windows swing jframe paint

正如here所讨论的那样,在Vista中调整Swing应用程序的大小(以及我正在使用的Windows 7)时,右下角会出现黑色背景,而Swing的重绘会赶上更改

使用其他应用程序(Windows资源管理器(本机),Firefox(C ++?)和Eclipse(Java))我注意到它们都有同样的问题 - 与上面链接中的人员说的相反 - 但它们最小化灰色填充颜色的问题远远不如Swing中出现的黑色那么引人注目。

我想知道是否有某种方法可以改变这一点,以便Swing的行为与其他应用程序一样?我尝试设置JFrame的背景颜色,但无济于事。

其他信息 Jonas发现(见下面的信息性答案)这是JFrames的一个问题,但不是AWT框架 - 也许这会帮助有人解决这个问题。

3 个答案:

答案 0 :(得分:3)

我注意到了同样的问题。这种颜色在IE上是灰色的,在Opera中是黑色的,在Eclipse中它是灰色的。它接缝在Swing中更加明显,因为它在重新绘制时接缝要慢一点,颜色如你所说,黑色。如果使用左上角调整大小,则此问题更明显。

我编写了一个示例并试图了解这种黑色的定义。一个JFrame has many layers,所以我在每一层都设置了不同的背景。

import java.awt.Color;
import javax.swing.JFrame;

public class BFrame {

    public static void main(String[] args) {
        new JFrame() {{
            super.setBackground(Color.CYAN);
            this.getRootPane().setBackground(Color.BLUE);
            this.getLayeredPane().setBackground(Color.RED);
            this.getContentPane().setBackground(Color.YELLOW);
            this.setSize(400,340); 
            this.setVisible(true);
        }};
    }
}

但是这个例子并没有帮助。也许颜色由超类设置为Frame

java.lang.Object
  java.awt.Component
      java.awt.Container
          java.awt.Window
              java.awt.Frame

我的理念是,由于Swing自己绘制,但使用原生窗口,然后是在调整大小之前绘制的本机背景,并且在调整大小之后绘制Swing的背景。但对于本机应用程序,在调整大小之前会绘制背景。

更新:我现在尝试使用Frame它没有遇到同样的问题。在调整大小之前要绘制的背景接缝。

import java.awt.Color;
import java.awt.Frame;

public class B2Frame extends Frame {

    public static void main(String[] args) {
        new Frame() {{
            setBackground(Color.YELLOW);
            setSize(400,340);
            setVisible(true);
        }};
    }

}

答案 1 :(得分:2)

框架负责绘制背景,因此您需要确保让它完成任务。

您可以通过设置:

来证明这一点
System.setProperty("sun.awt.noerasebackground", "true");

这会导致背景在调整大小扩展时始终为黑色。 (所以不要这样做。)

以下对我有用:

  1. (仅限AWT)使用createBufferStrategy(2)设置双缓冲 - 包含在addNotify()中,否则您将在创建帧期间遇到异常

    (步骤1仅在AWT中是必需的,因为默认情况下Swing是双缓冲的。)

  2. 始终(重要)在super()实施中致电Frame.paint()

  3. 使用setBackground()设置背景颜色,然后展开框架时背景应始终为相同颜色

  4. 示例代码:

        class InnerFrame extends Frame {
            public void addNotify() {
                super.addNotify();
                // Buffer
                createBufferStrategy(2);           
                strategy = getBufferStrategy();
            }
    
            public void paint(Graphics g) {
                super(g);
                //...
            }
            //...
         }
    

答案 2 :(得分:1)

我也注意到了这一点。对我来说,这个问题是通过更改布局管理器解决的(之前我使用过自由格式布局)并且它工作得很好(系统颜色绘画)。

但最终我又回到了FFL。另外一些知名应用程序面临这个问题(例如SKYPE),但实际上我并不介意......