Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 重新绘制()不重新绘制_Java_Repaint - Fatal编程技术网

Java 重新绘制()不重新绘制

Java 重新绘制()不重新绘制,java,repaint,Java,Repaint,我似乎不完全理解paintcomponent方法,包括重新绘制的使用。 有好几次我不明白为什么重绘在某些代码中不起作用,而在另一个代码中却可以很好地工作。 我正在尝试创建一个图形绘制类。现在它的y=x。但这行不通。paintcomponent似乎只调用了一次。为什么呢 public class Graph extends JPanel { private int oldX=0,oldY=0,newX=1,newY=1; public Graph() { i

我似乎不完全理解paintcomponent方法,包括重新绘制的使用。 有好几次我不明白为什么重绘在某些代码中不起作用,而在另一个代码中却可以很好地工作。 我正在尝试创建一个图形绘制类。现在它的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);
    }
}
公共类图扩展了JPanel
{
private int oldX=0,oldY=0,newX=1,newY=1;
公共图()
{
invokeInitWindow();
}
public void invokeInitWindow()
{
SwingUtilities.invokeLater(新的Runnable()
{
公开募捐
{
init();
}
});
}
公共void init()
{
JFrame=新JFrame();
frame.setPreferredSize(新尺寸(300300));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
框架。添加(此);
frame.pack();
frame.setVisible(true);
}
公开作废动议()
{
newY=++newX;
oldX=oldY=newX+1;
}
公共空间
{
while(newX<500)
{
move();
重新油漆();
}
}
公共静态void main(字符串[]args)
{
图g=新图();
g、 runGraph();
}
公共组件(图形g)
{
g、 设置颜色(颜色为黑色);
g、 抽绳(oldX,oldY,newX,newY);
}
}

所以,在添加了一些关于这个地方的
System.out.println
命令之后,很明显,基本上你有一个种族条件

也就是说,您的
虽然循环运行得很快,但实际上在窗口在屏幕上可见之前就完成了,所以它在屏幕的某个地方绘制了一个点

你需要做的是,在循环中注入一个小的延迟来降低它的速度(这样一个人就可以看到它),比如

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();
    }
}

是的,但是你
,而loop
运行得太快了,在画面出现之前就结束了。好的,谢谢你的快速和有用的评论,实际上我想要的是在足够小的间隔内“绘制”一组这些线,这样它就可以绘制一个图了。我仍然在努力解决这个问题,因为它每次都会刷新,所以我得到的是一条移动的小线,但它不会“停留”在原来的位置。绘制是破坏性的,如果你想在“块”中绘制图形,那么你需要维护这些块的
列表
,当调用
paintComponent
时,再次绘制它们
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class Graph extends JPanel {

    private int oldX = 0, oldY = 0, newX = 1, newY = 1;

    public Graph() {
    }

    public void move() {
        newY = ++newX;
//      oldX = oldY = 
        newX += 1;
    }

    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();
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                Graph g = new Graph();
                JFrame frame = new JFrame();
                frame.setPreferredSize(new Dimension(300, 300));
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(g);
                frame.pack();
                frame.setVisible(true);
                Thread t = new Thread(new Runnable() {
                    @Override
                    public void run() {
                        g.runGraph();
                    }
                });
                t.start();
            }
        });

    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.BLACK);
        g.drawLine(oldX, oldY, newX, newY);
    }
}