Java repaint() 是如何工作的?

How does Java repaint() work?

我想学习 java 绘画,所以我创建了一些代码来了解 java 绘画和重绘的工作原理。这是2个代码示例,它们之间有什么区别?为什么重绘不起作用?

第一个代码示例(有效)

package com.oguz;
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.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class PaintTest3 extends JFrame{
    JPanel panel1;
    int i = 1;
    public PaintTest3() {
        panel1 = new JPanel();
        JButton btn = new JButton("Button");
        btn.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent arg0) {
                i++;
                Graphics g = panel1.getGraphics();
                g.setColor(Color.BLACK);
                g.drawLine(10, 10, i * 5, 10);
            }
        });
        add(panel1);
        add(btn, BorderLayout.NORTH);
    }
    public static void main(String args[]){
        PaintTest3 pt = new PaintTest3();
        pt.setDefaultCloseOperation(EXIT_ON_CLOSE);
        pt.setSize(600, 500);
        pt.setVisible(true);
    }
}

repaint() 调用

public void paint(Graphics g){}

方法。这是为了简化编码过程,因为在较大的程序中将多次调用 paint 方法。每次我们都应该将 Graphics 对象作为参数传递。为了尽量减少这种情况,我们有 repaint()。

我试过你的第二个版本,效果很好。我唯一需要更改的是将线进一步向下:g.drawLine(10, 100, i * 5, 100); 因为它被绘制在按钮后面。理想情况下,如果你想在一个区域中绘制,那么你可以使用自定义 paint 扩展 JPanel 并将其放在按钮下方。

进一步解释重绘 - 'repaint' 的目的是告诉 window 管理器您更改了需要重绘组件的内容。重绘操作将在稍后使用 paint 发生(实际上在不同的线程中)。 window 管理器可能会为多个重绘调用绘制一次(如果它们发生得足够快)。您不应该在自己的代码中调用 paint:您实现它并让系统在需要时调用它。

您的第一个实现的问题是,如果必须在没有按下按钮的情况下进行绘制,则什么也不会发生。例如,如果您调整 window 或 minimize/maximize 的大小。

因此,总而言之,您的第二个实现是正确的,您只需要正确定位您的线,理想情况下,在面板而不是框架中绘制。