Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 更改Swing窗口的基础背景色_Java_Windows_Swing_Jframe_Paint - Fatal编程技术网

Java 更改Swing窗口的基础背景色

Java 更改Swing窗口的基础背景色,java,windows,swing,jframe,paint,Java,Windows,Swing,Jframe,Paint,如前所述,在Vista(以及我正在使用的Windows 7)中调整Swing应用程序的大小时,右/下角会出现一个黑色背景,而Swing的重新绘制会跟上变化 在使用其他应用程序(Windows资源管理器(本机)、Firefox(C++?)和Eclipse(Java))时,我注意到它们都有相同的问题——与上面链接中的人所说的相反——但它们通过使用灰色填充颜色来最小化问题,灰色填充颜色在视觉上远没有Swing中显示的黑色那么刺耳 我想知道是否有办法改变这一点,使Swing的行为与其他应用程序类似?我尝

如前所述,在Vista(以及我正在使用的Windows 7)中调整Swing应用程序的大小时,右/下角会出现一个黑色背景,而Swing的重新绘制会跟上变化

在使用其他应用程序(Windows资源管理器(本机)、Firefox(C++?)和Eclipse(Java))时,我注意到它们都有相同的问题——与上面链接中的人所说的相反——但它们通过使用灰色填充颜色来最小化问题,灰色填充颜色在视觉上远没有Swing中显示的黑色那么刺耳

我想知道是否有办法改变这一点,使Swing的行为与其他应用程序类似?我尝试设置JFrame的背景色,但没有效果

其他信息
Jonas发现(见下面的信息性答案)这是JFrames的问题,而不是AWT Frames的问题——也许这会帮助别人解决这个问题。

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

我编写了一个示例,试图理解黑色的定义。A,所以我在每一层设置了不同的背景

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);
        }};
    }
}
但这个例子没有帮助。也许颜色是由一个超类设置为

我的理论是,由于Swing本身绘制,但使用本机窗口,因此在调整大小之前绘制本机背景,在调整大小之后绘制Swing背景。但对于本机应用程序,在调整大小之前绘制背景

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

}
更新:我尝试了一个现在,它没有同样的问题。调整大小之前要绘制的背景接缝

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

}

我也注意到了这一点。对我来说,这个问题是通过更改布局管理器(我以前使用过自由格式布局)解决的,而且效果很好(系统颜色绘制)


但最终我又回到了FFL。另外,一些著名的应用程序也面临这个问题(例如SKYPE),但我并不介意……

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

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

System.setProperty("sun.awt.noerasebackground", "true");
这将导致背景在缩放扩展时始终为黑色。(所以不要这样做。)

以下几点对我很有用:

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

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

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

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

  • 示例代码:

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

    你能给我一个简短的代码片段吗?@Bragaadesh:你可以在我的答案中运行代码。@Jonas:知道了,有点奇怪,我已经用秋千工作了这么久,但没有注意到。我想我有一两个候补人选,我会尽力在这个问题上有所作为。好问题,顺便问一下+1你有“自由形式布局”的链接吗?谢谢你的详细回答,并尝试了所有这些东西。我想知道为什么会有这种差异,以及是否有办法解决它。我想知道是否有任何方法可以设置JFrame本身的颜色(与getContentPane()相反,getContentPane()似乎是唯一一个可以做任何事情的方法)。我只是尝试获取JFrame的图形对象并设置其颜色,但这也不起作用。关于默认灰色背景的设置,您有什么想法吗?也许这与此有关。@dimo414:默认的灰色是在JFrame:with
    setBackground(UIManager.getDefaults().getColor(“control”))中设置的
    @dimo414:如果跳过本机标题栏和边框,则可以解决此问题。请看我的问题和答案:是的,我可以这样做,但在我看来,这似乎是一个非常全面的解决方案,如果你能原谅我的话,这是一个远比我想要的复杂得多的解决方案/特别是/考虑到你发现Frame没有同样的问题,我仍然想知道是否有一些方法可以在Swing中实现同样的功能,而不必完全放弃Windows Aero。我相当肯定Frame也有同样的问题,只是它重新绘制的速度快了一点,所以不那么明显。在我使用的解决方案中,对于较小的内容,框架几乎会立即调整大小,但一旦内容增加一点,调整大小时黑色背景肯定是可见的。我认为这确实是一个平台问题,因为Java没有与Aero正确交互来设置颜色。很有趣,谢谢。下次我在做一个Swing项目时,我会尝试研究这个问题。我还发现,在框架的主要子对象中添加ComponentListener似乎对调整大小问题(添加到原始答案中)有很大帮助。在过去几个月里,我更新了基于修复此问题的解决方案。我已经好几个月没有研究过这个问题了,然后我看了大概20分钟前,然后你发布了一个编辑o_o谢谢!今晚我在windows机器上玩它。很抱歉耽搁了,我试着实现了你答案中的代码片段,我能告诉你的是,它什么也没做。调用super.paint(g)很重要,是的,但是即使您根本没有覆盖paint(),也会出现这个问题。挫折也不会产生立竿见影的影响。尝试运行Jonas在回答中发布的类,无论是扩展paint()还是实现ComponentListener都不会对黑色子背景产生任何影响。