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

Java Swing绘制矩形运行仅显示空白屏问题求助

代码问题排查与修复

核心问题点

  • 你设置了f.setLayout(null)空布局,空布局要求所有添加到容器的组件必须手动调用setBounds()指定位置和尺寸,否则组件默认大小为0,完全无法渲染。
  • 代码执行顺序错误:先调用f.setVisible(true)显示窗口,之后才添加绘图组件,Swing不会自动刷新显示后置添加的新组件。
  • DrawRectangle类的paintComponent方法没有调用父类实现super.paintComponent(g),会导致基础背景绘制异常。
  • 重复添加了两次DrawRectangle实例,属于冗余操作。

修复方案

最简单的优化是去掉空布局,使用Swing默认的BorderLayout,让绘图组件自动占满整个窗口,同时调整执行顺序,先添加组件再显示窗口。
修复后的完整代码如下:

import javax.swing.*;
import java.util.ArrayList;
import java.util.Random;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Color;
import java.awt.geom.Rectangle2D;

class DrawRectangle extends JComponent{
    // 后续可以传入数组用来绘制对应高度的矩形
    private ArrayList<Integer> nums;
    private int eachColWidth;

    public DrawRectangle(ArrayList<Integer> nums, int eachColWidth) {
        this.nums = nums;
        this.eachColWidth = eachColWidth;
    }

    @Override
    public void paintComponent(Graphics g){
        // 必须调用父类方法完成基础绘制
        super.paintComponent(g);
        Graphics2D g2=(Graphics2D) g;
        g2.setPaint(Color.PINK);
        // 测试用单个矩形
        Rectangle2D rect=new Rectangle2D.Double(50,50,200,200);
        g2.draw(rect);
        g2.fill(rect);

        // 后续绘制数组对应矩形的示例逻辑
        /*
        int baseY = getHeight() - 50; // 矩形底部基线
        for (int i = 0; i < nums.size(); i++) {
            int height = nums.get(i) * 4; // 数值放大方便查看
            int x = 50 + i * eachColWidth;
            int y = baseY - height;
            Rectangle2D col = new Rectangle2D.Double(x, y, eachColWidth - 2, height);
            g2.fill(col);
        }
        */
    }
}

public class Sorter {
    static int numElements = 20;
    static int width = 800;
    static int height = 500;

    public void newList(){

    }
    public static void main(String[] args) {
        ArrayList<Integer> nums = new ArrayList<Integer>();
        Random rand = new Random();

        for(int i = 0; i < numElements; i++){
            int randomNum = rand.nextInt(100);
            nums.add(randomNum);
        }

        // 创建JFrame
        JFrame f=new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setSize(width,height);

        int arrWidth = width - 200;
        int eachCol = arrWidth / nums.size();

        // 先添加组件再显示窗口
        DrawRectangle rec= new DrawRectangle(nums, eachCol);
        f.add(rec);

        // 去掉null布局,使用默认布局让组件自动占满窗口
        f.setVisible(true);
    }
}

补充说明

如果需要保留空布局,需要在添加DrawRectangle实例后调用rec.setBounds(0, 0, width, height)手动指定组件的大小和位置,再调用f.repaint()刷新窗口即可显示矩形。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 23:48:01