我遇到了问题。我的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();
}
}
感谢帮助! (:
答案 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 Swing和Performing Custom Painting
另外,在设置框架大小之前调用setResizable
,这会改变框架装饰的大小,并且可以在框架内容区域内产生意外的额外间距......