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

JFrame中矩形仅手动调整窗口大小后才显示的问题求助

问题解决:Swing初始窗口不显示矩形,调整大小后才显示

核心问题

  1. 错误重写JFrame的paint方法,干扰了窗口正常绘制流程
  2. 未在事件调度线程(EDT)中创建和显示Swing组件

修复方案

步骤1:用JPanel负责绘图(Swing标准做法)

自定义JPanel并重写paintComponent方法,这是Swing绘图的正确入口:

import javax.swing.*;
import java.awt.*;

class DrawingPanel extends JPanel {
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g); // 必须调用,保证面板背景等基础绘制
        Graphics2D g2d = (Graphics2D) g;
        g2d.setColor(Color.BLUE);
        g2d.drawRect(30, 50, 10, 10);
    }
}

步骤2:修改JFrame类,加载自定义面板

调整FieldView,不再直接重写JFrame的paint方法,改为添加自定义绘图面板:

import javax.swing.*;
import java.awt.*;

public class FieldView extends JFrame {
    public FieldView(String name) {
        super(name);
        getContentPane().setBackground(Color.WHITE);
        add(new DrawingPanel()); // 将绘图面板添加到窗口内容区
        setSize(480, 200);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
    }
}

步骤3:在EDT中启动Swing应用

Swing组件的创建和显示必须在事件调度线程中执行,避免线程安全和绘制时机问题:

import javax.swing.SwingUtilities;

public class AnimalApplication {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            FieldView view = new FieldView("My view");
            view.setVisible(true);
        });
    }
}

原因说明

  • JFrame的paint方法负责绘制窗口非客户区(标题栏、边框)并调度客户区绘制,直接重写会打乱绘制顺序,导致初始显示时矩形未被正确渲染,调整窗口大小触发完整重绘流程才显示。
  • Swing是单线程模型,所有组件操作必须在EDT中进行,主线程直接创建窗口可能导致绘制任务被延迟或跳过。

内容的提问来源于stack exchange,提问作者Viviane

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 01:46:19