重绘()不重绘

时间:2017-03-20 09:53:42

标签: java repaint

我似乎并不完全理解paintcomponent方法,包括使用重绘。 好几次,我不明白为什么重绘不使用某些代码,而在另一个代码中工作正常。 我试图创建一个Graph绘画类。现在它的y = x。但它不会起作用。 paintcomponent似乎只被调用一次。那是为什么?

public class Graph extends JPanel
{
    private int oldX=0,oldY=0,newX=1,newY=1;
    public Graph()
    {
        invokeInitWindow();
    }
    public void invokeInitWindow()
    {
        SwingUtilities.invokeLater(new Runnable()
                {
                    public void run()
                    {
                        init();
                    }
                });

    }
    public void init()
    {
        JFrame frame = new JFrame();
        frame.setPreferredSize(new Dimension(300,300));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(this);
        frame.pack();
        frame.setVisible(true);
    }
    public void move()
    {
        newY=++newX;
        oldX=oldY=newX+1;
    }
    public void runGraph()
    {
        while(newX < 500)
        {
            move();
            repaint();
        }
    }
    public static void main(String[] args)
    {
        Graph g = new Graph();
        g.runGraph();
    }
    public void paintComponent(Graphics g)
    {
        g.setColor(Color.BLACK);
        g.drawLine(oldX, oldY, newX, newY);
    }
}

1 个答案:

答案 0 :(得分:0)

因此,在添加了一些关于该地点的System.out.println命令之后,显然您基本上处于竞争状态。

也就是说,你的while-loop能够如此快地运行,它实际上是在屏幕上可见窗口之前完成的,所以它在屏幕的某处画了一个点。

你需要做的是,在循环中注入一个小延迟以减慢它(所以一个人可以真正看到它),类似......

public void runGraph() {
    while (newX < 500) {
        try {
            Thread.sleep(40);
        } catch (InterruptedException ex) {
            Logger.getLogger(Graph.class.getName()).log(Level.SEVERE, null, ex);
        }
        move();
        repaint();
    }
}

代码审查

抱歉,不禁自己。您编写的(重要)问题之一是构造函数具有副作用,即它创建JFrame并在将来的某个时间执行此操作。这是你真正想避免做的事情。构造函数应该初始化对象的状态,这就是全部。

目前你设置它的方式,你不可能以任何有意义的方式重新使用面板。

其次,在进行任何自定义绘画之前,你真的应该调用super.paintComponent。绘画是Swing由一系列链接在一​​起的方法调用组成,每个方法都做一个小而重要的工作,除非你确切知道该方法正在做什么,你将接管它的工作,它只是简单地称之为{ {1}}方法。

我猜你正试图绘制一条增长的线,所以我修改了super方法,所以线的起点保持不变。我可能是你打算让它在屏幕上移动,在这种情况下,恢复代码并不困难,我只是不确定

move