Java JPanel repaint() 问题?

Posted

技术标签:

【中文标题】Java JPanel repaint() 问题?【英文标题】:Java JPanel repaint() issue? 【发布时间】:2014-08-14 07:40:15 【问题描述】:

我对 GUI 有点陌生。我创建了这个简单的应用程序,每次按下按钮时都会用不同的颜色绘制一个椭圆形。但是,当我调用JPanelrepaint() 时,它不仅仅是重新绘制面板的框架部分(椭圆形)。相反,它会重新绘制整个框架,并且还会绘制我在框架顶部(北部边界)单击的按钮。我知道我可以简单地调用JFramerepaint() 来解决这个问题,但我只是想知道为什么会这样。我认为repaint() 所做的只是简单地调用对象的paintComponent()。 有人可以解释为什么它会这样吗? 谢谢!!

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Jbutton extends JFrame implements ActionListener 
    JFrame frame;
    JButton b;
    panel p;

    public void go() 
        frame = new JFrame();
        b = new JButton("click me");
        p = new panel();
        b.addActionListener(this);
        frame.add(BorderLayout.CENTER, p);
        frame.add(BorderLayout.SOUTH, b);
        frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
        frame.setSize(250, 250);
        frame.setVisible(true);

    

    class panel extends JPanel 
        public void paintComponent(Graphics g) 
            int red = (int) (Math.random() * 255);
            int green = (int) (Math.random() * 255);
            int blue = (int) (Math.random() * 255);
            g.setColor(new Color(red, blue, green));
            g.fillOval(20, 30, 50, 50);
        



@Override
public void actionPerformed(ActionEvent arg0) 
    p.repaint();



【问题讨论】:

【参考方案1】:

确保您正在调用 super.paintComponent 以准备 Graphics 绘制上下文

@Override
protected void paintComponent(Graphics g) 
    super.paintComponent(g)
    int red = (int) (Math.random() * 255);
    int green = (int) (Math.random() * 255);
    int blue = (int) (Math.random() * 255);
    g.setColor(new Color(red, blue, green));
    g.fillOval(20, 30, 50, 50);
 

总而言之,Graphics 上下文是共享资源。在绘制周期中绘制的每个组件都将共享相同的Graphics 上下文,这意味着之前绘制的内容仍然存在。每次调用 paintComponent 时,您都需要清除/准备 Graphics 上下文。

这基本上就是paintComponent 所做的......

【讨论】:

以上是关于Java JPanel repaint() 问题?的主要内容,如果未能解决你的问题,请参考以下文章

如果在 JFrame 代码中调用 repaint(),JPanel 不会重新绘制

java游戏开发杂谈 - 界面刷新坐标系

什么决定了 Java 中的组件可见性?

Java 的 JPanel 子类中重写父类的 paint 方法 会被自动调用,请问调用的条件或时机

事件发生后如何重新绘制JPanel

交换JPanel,第二个JPanel不显示