Java 一辆行驶中的汽车不断闪动(隐藏)

Java 一辆行驶中的汽车不断闪动(隐藏),java,multithreading,jframe,Java,Multithreading,Jframe,我有以下代码: import javax.swing.*; import java.awt.*; import java.awt.event.*; public class Exercise2 extends JFrame implements ActionListener{ public int x = 20 ,direction = 1; public Exercise2(){ setSize(400, 200); setTitle(

我有以下代码:

import javax.swing.*;

import java.awt.*;
import java.awt.event.*;

public class Exercise2 extends JFrame implements ActionListener{
    public int x = 20 ,direction = 1;

    public Exercise2(){
         setSize(400, 200);
         setTitle("Moving Car");
         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         setLayout(new BorderLayout());
         JButton move = new JButton("Move the car");
         move.addActionListener(this);
         add(move , BorderLayout.SOUTH);
         setVisible(true);
    }
    public void paint(Graphics g){
        super.paint(g);
        g.drawRect(x, 80, 80, 50);
            g.drawOval(x, 130, 30, 30);
            g.drawOval(x+50, 130, 30, 30);
    }
    public void actionPerformed(ActionEvent e){
         MyThread ex = new MyThread();
            ex.start();
}



private class MyThread extends Thread {
    public void run(){
        while(true){
            if(x >= getWidth()-70)
                direction = -1;
            else if (x <= 0)
                direction = 1 ;
            x += direction *10;

            try{
                Thread.sleep(100);
            }catch(InterruptedException e){
                System.exit(0);
            }
            repaint();
        }
    }
}



public static void main(String []args){
    new Exercise2();

}
}
import javax.swing.*;
导入java.awt.*;
导入java.awt.event.*;
公共类Exercise2扩展JFrame实现ActionListener{
公共整数x=20,方向=1;
公众锻炼2(){
设置大小(400200);
setTitle(“移动汽车”);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(新的BorderLayout());
JButton move=新JButton(“移动汽车”);
move.addActionListener(this);
添加(移动,BorderLayout.SOUTH);
setVisible(真);
}
公共空间涂料(图g){
超级油漆(g);
g、 drawRect(x,80,80,50);
g、 深椭圆形(x,130,30,30);
g、 牵引椭圆(x+50,130,30,30);
}
已执行的公共无效操作(操作事件e){
MyThread ex=新的MyThread();
例如,start();
}
私有类MyThread扩展线程{
公开募捐{
while(true){
如果(x>=getWidth()-70)
方向=-1;

否则,如果(xJFrame)重绘的速度比您移动汽车的速度慢,则重绘时,图片将在短时间内“空白”

增加Thread.sleep(100);到Thread.sleep(1000);并查看差异

编辑:通过一些谷歌搜索,我发现了一些可能导致解决方案的东西,来自:

不要在JFrame的paint方法中直接绘制,而是绘制一个JPanel或JComponent并重写其paintComponent方法,因为Swing默认情况下会进行双缓冲,这将允许您利用这一点


编辑2:同样的,JFrame重画的速度比你移动汽车的速度慢,当重画发生时,画面会在短时间内“空白”

增加Thread.sleep(100);到Thread.sleep(1000);并查看差异

编辑:通过一些谷歌搜索,我发现了一些可能导致解决方案的东西,来自:

不要在JFrame的paint方法中直接绘制,而是绘制一个JPanel或JComponent并重写其paintComponent方法,因为Swing默认情况下会进行双缓冲,这将允许您利用这一点


编辑2:同样的,JFrame重画的速度比你移动汽车的速度慢,当重画发生时,画面会在短时间内“空白”

增加Thread.sleep(100);到Thread.sleep(1000);并查看差异

编辑:通过一些谷歌搜索,我发现了一些可能导致解决方案的东西,来自:

不要在JFrame的paint方法中直接绘制,而是绘制一个JPanel或JComponent并重写其paintComponent方法,因为Swing默认情况下会进行双缓冲,这将允许您利用这一点


编辑2:同样的,JFrame重画的速度比你移动汽车的速度慢,当重画发生时,画面会在短时间内“空白”

增加Thread.sleep(100);到Thread.sleep(1000);并查看差异

编辑:通过一些谷歌搜索,我发现了一些可能导致解决方案的东西,来自:

不要在JFrame的paint方法中直接绘制,而是绘制一个JPanel或JComponent并重写其paintComponent方法,因为Swing默认情况下会进行双缓冲,这将允许您利用这一点



编辑2:更多关于相同的内容,请参见

我认为汽车图形可以更新。:PI将睡眠时间更改为500,效果很好,但如何在不更改睡眠时间的情况下解决问题?找到解决方案。我认为汽车图形可以更新。:PI将睡眠时间更改为500,效果很好,但如何解决在不改变睡眠时间的情况下?找到了解决方案。我认为汽车图形可以更新。:PI将睡眠时间更改为500,效果很好,但如何在不改变睡眠时间的情况下解决问题?找到了解决方案。我认为汽车图形可以更新。:PI将睡眠时间更改为500,它是w工作很好,但是如何在不改变睡眠时间的情况下解决它呢?找到了可以解决问题的方法。是的,我把它改为500,它工作得很好,但是没有办法在不改变睡眠时间的情况下解决它吗?我不知道。我可能会猜测,在这里,jframe的swing框架使用速度太慢,不容易修复这里。但必须有一种方法来修复它,在最坏的情况下使用另一个库。是的,我将它改为500,它工作得很好,但没有一种方法可以在不改变睡眠时间的情况下解决它吗?我不知道。我可能会猜,在这里使用jframe的swing框架太慢了,在这里不容易修复。但必须有一个解决方法修复它的方法,在最坏的情况下使用另一个库。是的,我将它改为500,它工作得很好,但是没有一种方法可以在不改变睡眠时间的情况下解决它吗?我不知道。我可能会猜,在这里,swing框架使用jframe的速度太慢了,并且在这里不容易修复。但是在最坏的情况下,必须有一种方法来修复它请使用另一个库。是的,我将它改为500,它工作得很好,但是没有办法在不改变睡眠时间的情况下解决它吗?我不知道。我可能会猜测,在这里,使用jframe的swing框架太慢了,在这里不容易修复。但是必须有一种方法来修复它,在最坏的情况下,使用另一个库。