You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:02:01