更改摆动窗口的基础背景色

2022-09-04 22:58:49

正如这里所讨论的,在Vista(和Windows 7,这就是我使用的Windows 7)中调整Swing应用程序的大小时,您会在右/下角获得黑色背景,而Swing的重新绘制会赶上更改。

使用其他应用程序(Windows资源管理器(本机),Firefox(C++?)和Eclipse(Java)))我注意到它们都有同样的问题 - 与上面链接中的人所说的相反 - 但是它们通过灰色填充颜色来最小化问题,这远远小于Swing中出现的黑色视觉刺耳。

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

附加信息Jonas发现(请参阅下面的信息性答案)这是JFrames的问题,但不是AWT Frames的问题 - 也许这将有助于某人弄清楚这一点。


答案 1

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

我编写了一个示例,并试图了解这种黑色的定义位置。JFrame有很多层,所以我在每一层上设置了不同的背景。

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);
        }};
    }

}

答案 2

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

您可以通过设置以下内容来演示这一点:

System.setProperty("sun.awt.noerasebackground", "true");

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

以下内容对我有用:

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

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

  2. 在实现中始终(重要)调用super()Frame.paint()

  3. 设置背景颜色,然后在扩展框架时,背景应始终是相同的颜色setBackground()

示例代码:

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

        public void paint(Graphics g) {
            super(g);
            //...
        }
        //...
     }

推荐