重绘 JComponent 的正确方法

Proper way for Repainting JComponent

所以,我在 java 上考过 AP class,在 class 上,我们从未真正考过 repaint(),以及如何正确使用它。我也在网上搜索过,我个人没有找到任何关于标准调用方式的答案repaint()。我们是否应该像下面这样从 main class 调用 repaint() 方法?

import java.awt.*;
import javax.swing.*;

public class RepaintExample{

    public static void main(String[] args){

        JFrame frame = new JFrame();
        JComponent component = new JComponent();
        frame.add(component);
        frame.repaint();
    }

}

或者我会这样称呼 JComponent.repaint()

import java.awt.*;
import javax.swing.*;

public class RepaintExample{

    public static void main(String[] args){

        JFrame frame = new JFrame();
        JComponent component = new JComponent();
        frame.add(component);
        component.repaint();
    }

}

或者,这两种方法都是错误的,JComponent.repaint() 应该从 paintComponent 调用,如下所示:

import java.awt.*;
import javax.swing.*;

public class ComponentRepaintExample extends JComponent{

    public void paintComponent(Graphics g){

        //Draw stuff
        for(int i = 0; i < 10; i++){
            //Draw stuff
            this.repaint();
        }
    }

}

这三种方法很可能都是错误的。感谢您提供有关如何正确使用 repaint() 方法的任何帮助。整个主题对我来说非常笼统,所以如果我使用的任何术语不正确,我深表歉意。提前致谢。

为什么您认为需要调用 repaint()?

当组件的 属性 发生变化时,Swing 组件会自动调用 repaint() 方法。

例如,如果您有一个 JLabel 并调用 setText(...)setIcon(...),那么这些方法将自动调用 repaint()。

您永远不会从绘画方法中调用 repaint()。

如果您正在进行自定义绘画,那么您的代码的结构应该与任何其他 Swing 组件一样。也就是说,您为自定义组件创建 getter/setter 方法来更改组件的属性。在 setter 方法中调用 repaint().