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

Java Swing GUI点击触发repaint后无法切换形状颜色的问题

代码核心问题

  1. 自定义面板mojpanel的绘制逻辑完全写死,没有状态变量控制绘制内容,无论怎么调用repaint()都只会输出黑背景+渐变圆的效果
  2. 你编写的Painting类没有实际被使用,你往界面中添加的是mojpanel实例,初始红矩形的绘制逻辑根本没有生效的机会
  3. 启动类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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 17:00:00