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的可用显示区域。
解决方法
- 给自定义的
MyPanel设置明确的首选尺寸,保证绘制区域足够容纳你要画的矩形,在初始化MyPanel时调用setPreferredSize()方法设置即可。 - 要么调整矩形的绘制坐标适配
MyPanel的尺寸,要么设置MyPanel的尺寸大于矩形的右下角坐标(即宽>squareX+squareW,高>squareY+squareH)。 - 也可以根据需求调整
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
相关产品推荐
相关产品推荐

