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
相关产品推荐
相关产品推荐

