Java repaint()如何工作?

时间:2016-11-02 12:55:40

标签: java paint paintcomponent repaint

我想学习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);
    }
}

2 个答案:

答案 0 :(得分:1)

我尝试了你的第二个版本,它运行得非常好。我唯一需要改变的是让线条进一步向下:g.drawLine(10, 100, i * 5, 100);,因为它是在按钮后面绘制的。理想情况下,如果您想绘制区域,则可以使用自定义paint扩展JPanel,并将其放在按钮下方。

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

第一次实现的问题是如果在没有按下按钮的情况下必须进行绘制,则不会发生任何事情。例如,如果您调整窗口大小或最小化/最大化它。

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

答案 1 :(得分:0)

repaint()调用

public void paint(Graphics g){}

方法。这是为了简化编码过程,因为在更大的程序中将多次调用paint方法。每次我们都应该将Graphics对象作为参数传递。为了最小化这个,我们有repaint()。