JFrame背景错误:不需要的透明度

时间:2014-12-03 23:52:21

标签: java swing jframe transparency paint

我遇到了问题。我的JFrame从其内部的内容开始,但透明地显示内容在顶部。

package javagame;

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

public class JavaGame extends JFrame{

    public JavaGame(){
        setTitle("Java Game");
        setSize(500, 500);
        setResizable(false);
        setVisible(true);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public void paint (Graphics g){
        g.drawString("Hello World!", 250, 250);
    }

    public static void main(String[] args){

        new JavaGame();

    }

}

感谢帮助! (:

1 个答案:

答案 0 :(得分:2)

两件事......

首先...

您正在打破paint链......

public void paint (Graphics g){
    // You MUST call super.paint here...
    g.drawString("Hello World!", 250, 250);
}

第二

您应该不惜一切代价避免覆盖paint等顶级容器JFrame。很多原因,其中一个你刚刚发现,但也因为顶级容器没有双缓冲,这会在绘制时引入闪烁,JFrame包含一堆其他组件,JRootPane,内容窗格,玻璃窗格...所有这些都可以描绘您想要绘制的内容。

另外,直接在画框上画画可以让你在画框的装饰下画画,这不是你想要做的......

例如(为什么它很糟糕)......

解决方案......

创建一个自JPanel之类的自定义类,并覆盖它的paintComponent方法并在那里执行自定义绘制。您可以免费获得双缓冲支持,不再需要担心框架的边框,因为内容窗格将确保它在框架内部进行维护。

有关详细信息,请参阅Painting in AWT and SwingPerforming Custom Painting

另外,在设置框架大小之前调用setResizable,这会改变框架装饰的大小,并且可以在框架内容区域内产生意外的额外间距......