一辆动车一直闪烁(隐藏)

时间:2013-11-20 11:37:57

标签: 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("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();

}
}

当按下按钮时汽车开始移动但是如果我不将鼠标移到按钮上,它会保持闪烁

我的问题为什么会发生这种情况? **&amp; ** 如何解决它?

新: 我将睡眠时间改为500并且工作正常但是如何在不改变睡眠时间的情况下解决它?

1 个答案:

答案 0 :(得分:3)

JFrame重绘的速度比你移动汽车的速度慢 - 当重绘时,画面会暂时“空”。

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

编辑:通过一些谷歌搜索,我发现了一些可能导致解决方案的内容,来自My JFrame Flickers

  

不要在其paint方法中直接在JFrame中绘制。而是在JPanel或JComponent中绘制并覆盖其paintComponent方法,因为默认情况下Swing会进行双重缓冲,这样您就可以利用它。

edit2:Image flickers on repaint()

中的更多信息