【问题标题】:a moving car keeps flashing(hiding)一辆移动的汽车不断闪烁(隐藏)
【发布时间】:2013-11-20 11:37:56
【问题描述】:

我有以下代码:

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

}
}

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

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

新: 我将睡眠时间更改为 500 并且效果很好,但是如何在不更改睡眠时间的情况下解决它?

【问题讨论】:

  • 我认为汽车图形可以更新。 :P
  • 我把睡眠时间改成了500,效果很好,但是不改变睡眠时间怎么解决呢?
  • 找到了解决办法。

标签: java multithreading jframe


【解决方案1】:

JFrame 重绘绘画的速度比您移动汽车的速度慢 - 当重绘发生时,图片会在短时间内“空”。

增加 Thread.sleep(100);到 Thread.sleep(1000);看看有什么不同。

编辑:通过谷歌搜索,我从My JFrame Flickers 找到了一些可能导致解决方案的东西:

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

edit2:Image flickers on repaint() 中的更多内容

【讨论】:

  • 是的,我将其更改为 500 并且效果很好,但是没有办法在不更改睡眠时间的情况下解决它吗?
  • 我不知道。我可能会猜想 jframe 的摇摆框架在这里使用起来太慢了,而且在这里不容易修复。但是必须有一种方法来修复它,在最坏的情况下使用另一个库。
猜你喜欢
  • 2018-10-13
  • 1970-01-01
  • 1970-01-01
  • 2016-03-19
  • 2014-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多