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

Java在JFrame上使用Graphics绘制图形背景显示异常如何解决

问题原因
  • 组件显示时机错误:在还未完成组件添加、所有属性配置前就调用了frame.setVisible(true),后续修改背景、添加组件的操作未触发界面重绘,导致配置不生效。
  • 自定义绘制方法使用不规范:重写了JPanel的paint()方法,但没有先调用super.paint(g)完成组件基础背景的绘制;且Swing自定义绘制规范要求优先重写paintComponent()方法而非paint()方法。
  • 上层组件遮挡背景:添加的自定义JPanel默认是不透明的,会直接遮挡下层ContentPane的黑色背景,即便ContentPane背景设置生效也无法展示。
修复方案

修复后的完整可运行代码如下:

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

public class test1 {
    public static void main (String[] args) {
        JFrame frame = new JFrame();
        frame.setSize(1835,1019);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setResizable(false);
        
        JPanel raum = new JPanel() {
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                Graphics2D g2 = (Graphics2D) g;
                g2.setPaint(Color.WHITE);
                g2.drawLine(500,500,500,800);
            }
        };
        // 直接给承载绘制内容的JPanel设置黑色背景
        raum.setBackground(Color.BLACK);
        frame.add(raum);
        // 所有配置完成后再显示窗口
        frame.setVisible(true);
    }
}

核心修改点:

  • 调整setVisible(true)的调用位置,放到所有组件添加、属性配置的最后一步,保证所有配置都能正常生效。
  • 将重写paint()方法改为重写paintComponent(),增加@Override注解避免方法签名错误,方法开头调用super.paintComponent(g)完成组件基础背景的绘制逻辑。
  • 直接给自定义JPanel设置黑色背景,避开上层组件遮挡ContentPane背景的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 17:15:03