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

Java Swing GUI点击JButton后无法绘制上色各类图形的问题求助

问题排查及修复方案

核心问题清单

  • 实例引用错误:按钮点击事件中创建了新的MyPanel实例,该实例并未被添加到显示窗口中,生成的图形数据存储在这个未渲染的实例里,界面可见的面板根本没有拿到图形数据
  • 父类方法调用错误:重写paintComponent时错误调用了super.paintComponents(g)(多了后缀s),正确的父类方法应为super.paintComponent(g),错误调用会破坏Swing的绘制流程
  • 未触发重绘:生成图形数据后没有调用repaint()方法通知Swing刷新面板,即使数据正确也不会显示新图形
  • 自定义面板未挂载:main方法中添加到窗口的是默认JPanel,不是你实现了绘制逻辑的MyPanel

修正后代码

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import java.awt.BorderLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

@SuppressWarnings("serial")
public class MyPanel extends JPanel{
    
    private List<Shape> shapes = new ArrayList<Shape>();
    final int SIZE = 6;
    
    @Override
    public void paintComponent(Graphics g) {
          // 修正父类方法调用
          super.paintComponent(g);
          Graphics2D g2d = (Graphics2D) g;
              
          for (Shape shape: shapes) {
              g2d.setColor(shape.getColor());
              shape.drawShape(g2d);
          }
        
    }
    
    public static void main (String[] args) {
        // 提前创建自定义面板实例,后续操作都用这个实例
        MyPanel myPanel = new MyPanel();
        JButton loading = new JButton("Load shapes");
        JPanel controlPanel = new JPanel();
        JFrame frame = new JFrame("Display shapes");
        
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        // 用BorderLayout布局区分控制区和绘制区,避免自定义面板被挤压
        frame.add(controlPanel, BorderLayout.NORTH);
        frame.add(myPanel, BorderLayout.CENTER);
        frame.setSize(600, 600);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
        
        loading.addActionListener(new ActionListener()
                {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        // 直接调用已挂载到窗口的实例的生成方法,不要新建实例
                        myPanel.generateAllShapes();
                    }
                });
        
        controlPanel.add(loading);
    }
    
    public void generateAllShapes() {
        shapes = new ArrayList<Shape>();
        
        ShapeFactory sf = new ShapeFactory();
        for (int i = 0; i < SIZE; i++) {
            shapes.add(sf.generateShape());
        }
        sf.spaceShapes(shapes);
        // 生成完数据主动触发重绘
        repaint();
    }
}

额外注意点

你提供的drawShape方法中无需额外设置颜色,绘制循环里已经调用了g2d.setColor(shape.getColor()),只要Shape类的getColor()返回正确的颜色值,上色逻辑可正常运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 01:48:00