Java Swing GUI点击触发repaint后无法切换形状颜色的问题
代码核心问题
- 自定义面板
mojpanel的绘制逻辑完全写死,没有状态变量控制绘制内容,无论怎么调用repaint()都只会输出黑背景+渐变圆的效果 - 你编写的
Painting类没有实际被使用,你往界面中添加的是mojpanel实例,初始红矩形的绘制逻辑根本没有生效的机会 - 启动类
Test中多余创建了未使用的JFrame和mojpanel对象,属于冗余代码
修复方案
1. 修改mojpanel类,添加状态控制
给面板增加点击状态标记,根据状态切换绘制内容,重写paintComponent时必须先调用父类方法完成基础清屏操作
import java.awt.Color; import java.awt.GradientPaint; import java.awt.Graphics; import java.awt.Graphics2D; import javax.swing.JPanel; public class mojpanel extends JPanel { // 状态标记:false为初始状态,true为点击后状态 public boolean isClicked = false; @Override public void paintComponent(Graphics g) { super.paintComponent(g); if (!isClicked) { // 初始状态:红色矩形 g.setColor(Color.RED); g.fillRect(100, 100, 100, 100); } else { // 点击后状态:黑背景+橙粉渐变圆 g.setColor(Color.BLACK); g.fillRect(0, 0, this.getWidth(), this.getHeight()); GradientPaint gradient = new GradientPaint(70,70, Color.ORANGE, 150,150, Color.PINK); ((Graphics2D) g).setPaint(gradient); g.fillOval(100, 100, 100, 100); } } }
2. 修改SimpleGUI类,点击时更新面板状态
把mojpanel实例提升为类成员,点击按钮时修改它的状态再触发重绘
import javax.swing.*; import java.awt.*; import java.awt.event.*; public class SimpleGUI implements ActionListener { JButton button; JFrame frame; // 把面板提升为类成员,方便事件中修改状态 mojpanel panel; public void work() { frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); button = new JButton("Color change"); button.addActionListener(this); panel = new mojpanel(); frame.getContentPane().add(BorderLayout.SOUTH, button); frame.getContentPane().add(BorderLayout.CENTER, panel); frame.setSize(300,300); frame.setVisible(true); } @Override public void actionPerformed(ActionEvent event) { // 修改面板状态后再触发重绘 panel.isClicked = true; panel.repaint(); } }
3. 清理冗余代码
- 删掉完全没用的
Painting类 - 修改
Test类,去掉多余的对象创建逻辑,遵循Swing官方规范把界面启动代码放在事件调度线程执行
import javax.swing.SwingUtilities; public class Test { public static void main(String[] args) { SwingUtilities.invokeLater(() -> { SimpleGUI aplGUI = new SimpleGUI(); aplGUI.work(); }); } }
内容的提问来源于stack exchange,提问作者Lucyna Min
相关产品推荐
相关产品推荐

