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

Swing自定义JPanel重写paintComponent绘制矩形无显示问题

问题原因
  • 布局管理器导致MyPanel尺寸过小:你给JFrame设置的是FlowLayout布局,该布局会按照组件的首选尺寸(preferredSize)分配显示空间。你没有给自定义的MyPanel设置首选尺寸,Swing会默认给它分配极小的宽高,几乎没有可视区域。
  • 绘制坐标超出组件可视范围:paintComponent方法中的坐标是相对于当前MyPanel组件的左上角,而非整个JFrame窗口的全局坐标。你设置的矩形左上角为(50,50),如果MyPanel本身的宽高小于70px(50+20),矩形会直接绘制在MyPanel的可视区域外,自然无法显示。
  • 同布局下多组件挤压:你先给ContentPane添加了带JLabel的JPanel,之后才加MyPanel,FlowLayout会优先给前面的组件分配空间,进一步挤压MyPanel的可用显示区域。
解决方法
  1. 给自定义的MyPanel设置明确的首选尺寸,保证绘制区域足够容纳你要画的矩形,在初始化MyPanel时调用setPreferredSize()方法设置即可。
  2. 要么调整矩形的绘制坐标适配MyPanel的尺寸,要么设置MyPanel的尺寸大于矩形的右下角坐标(即宽>squareX+squareW,高>squareY+squareH)。
  3. 也可以根据需求调整JFrame的布局管理器,比如用BorderLayout把MyPanel放在中心区域,让它占满剩余窗口空间,避免被挤压。

修改后可运行代码示例

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

public class TestGui extends JFrame  {
    public TestGui()  {
        setLayout(new FlowLayout());

        JPanel panel = new JPanel();
        panel.add(new JLabel("H E L L O"));
        getContentPane().add(panel);

        // 给MyPanel设置首选尺寸,保证能容纳坐标为(50,50)、尺寸20*20的矩形
        MyPanel myPanel = new MyPanel();
        myPanel.setPreferredSize(new Dimension(70,70));
        getContentPane().add(myPanel);

        // 适当放大窗口避免组件被挤压
        setSize(200, 150);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }

    class MyPanel extends JPanel {
        private int squareX = 50;
        private int squareY = 50;
        private int squareW = 20;
        private int squareH = 20;

        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setColor(Color.RED);
            g.fillRect(squareX,squareY,squareW,squareH);
        }
    }

    public static void main(String[] args) {
        // Swing组件标准初始化写法,避免线程安全问题
        SwingUtilities.invokeLater(() -> new TestGui());
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 11:36:01