Java AWT Window实现中paint()运行但无绘制内容问题求助
问题原因分析与解决办法
我帮你排查了代码里的几个关键问题,这就是图形无法显示的核心原因:
1. 无限重绘循环导致绘制不稳定
你在paint()方法里调用了repaint(),这会触发一个死循环:repaint()会请求系统调用paint(),而paint()里又再次调用repaint(),系统一直在重复重绘操作,根本没法稳定显示你画的矩形。而且每次调用super.paint(g)还会清空窗口内容,刚画好的图形瞬间就被清除了。
2. 窗口初始化顺序错误
你先调用b.setVisible(true)再调用b.pack(),会导致窗口先以默认极小尺寸显示,之后再调整大小,但这个过程中绘制的内容不会被正确更新到新的窗口尺寸中。
3. 窗口无初始尺寸,pack()后过小
Frame默认没有初始大小,当你调用pack()时,因为窗口内没有添加任何组件,它会把窗口压缩到几乎看不见的极小状态,就算你画了16x16的矩形,也会因为窗口太小而被截断或完全看不到。
修正后的代码
import java.awt.Color; import java.awt.Frame; import java.awt.Graphics; import java.awt.Dimension; public class a { static a a = new a(); public static void main(String[] args) { b b = a.new b(); // 先设置窗口尺寸/调用pack,再显示窗口 b.pack(); b.setVisible(true); } class b extends Frame { public b() { super("AWT 绘图测试"); // 设置窗口标题,方便识别 } @Override public void paint(Graphics g) { super.paint(g); // 先调用父类paint完成初始化 g.setColor(Color.BLACK); g.fillRect(50, 50, 16, 16); // 把矩形移到窗口中间,避免被边框/标题栏遮挡 // 移除repaint(),终止无限循环 } // 重写该方法,让pack()能获取到合适的窗口尺寸 @Override public Dimension getPreferredSize() { return new Dimension(200, 200); } } }
关键修改点说明
- 移除
paint()里的repaint()调用,终止无限重绘循环 - 调整窗口初始化顺序:先调用
pack()(依赖重写的getPreferredSize()获取合适尺寸),再调用setVisible(true) - 重写
getPreferredSize()方法,让pack()能生成可见的窗口大小 - 把矩形位置从(0,0)移到(50,50),避免被窗口标题栏或边框遮挡
修改后运行代码,你就能看到窗口中显示的黑色16x16矩形了。
内容的提问来源于stack exchange,提问作者user11693308
相关产品推荐
相关产品推荐

