Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/259.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-具有多个线程且具有thread.sleep的不同绘制_Java_Multithreading_Paintcomponent_Repaint_Thread Sleep - Fatal编程技术网

Java-具有多个线程且具有thread.sleep的不同绘制

Java-具有多个线程且具有thread.sleep的不同绘制,java,multithreading,paintcomponent,repaint,thread-sleep,Java,Multithreading,Paintcomponent,Repaint,Thread Sleep,我是一个新手,我正在尝试制作一个游戏,但我不知道如何使用不同线程的不同画图重新绘制()。一个线程有thread.sleep,另一个没有 以下是我的代码: 游戏面板: public class GamePanel extends JPanel implements MouseListener, MouseMotionListener{ EnemyEngine enemyE = new EnemyEngine(); public GamePanel() { new Thread(new

我是一个新手,我正在尝试制作一个游戏,但我不知道如何使用不同线程的不同画图重新绘制()。一个线程有thread.sleep,另一个没有

以下是我的代码:

游戏面板:

public class GamePanel extends JPanel implements MouseListener, MouseMotionListener{

EnemyEngine enemyE = new EnemyEngine();

public GamePanel() {

    new Thread(new Runnable() {

        @Override
        public void run() {
            while(true){            
                repaint();
            }
        }
    }).start();

    new Thread(new Runnable() {

        @Override
        public void run() {
            while(true){            
                enemyE.update();
                enemyE.repaint();

                try { 
                    Thread.sleep(1000/10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }).start();
}
public void paintComponent(Graphics g) {
    // board painting
}

}
灌肠机:

public class EnemyEngine extends JPanel{

Vector<Enemy> enemyVect = new Vector<>();

Random rand = new Random();

public void paintComponent(Graphics g){
    for (Enemy enemy : enemyVect) {
        enemy.render(g);
    }
}

public void update() { 
    for (Enemy enemy : enemyVect) {
        enemy.move();
    }
}

}
公共类EnemyEngine扩展了JPanel{
Vector enemyVect=新向量();
Random rand=新的Random();
公共组件(图形g){
for(敌人:enemyVect){
敌人。渲染(g);
}
}
public void update(){
for(敌人:enemyVect){
敌人。移动();
}
}
}
我已经在互联网上搜索过了,但仍然没有成功……或者我就是那个愚蠢的人:/


请帮我senpai

我不太明白你关于重新喷漆的问题?
如果您想立即刷新ui,为什么不立即使用paintInstance(0,0,getWidth(),getHeight())

首先,阅读。其次,
while(true)repaint()将阻塞Swing事件线程;你不需要每秒绘制数百次。仅当确定绘制内容的数据已更改时,才调用repaint()。第三,必须使用javax.swing.Timer或java.awt.EventQueue.invokeLater(…),以确保只从awt事件调度线程调用swing方法;请参阅。一般来说,还建议将“绘制”和其他此类用户界面任务委托给一个线程。。。也许,这是一条不做其他事情的线。这个线程可能会在等待一个异步信号时休眠,该信号告诉它,“请现在去更新用户界面”,然后它就会唤醒并执行此操作。(这种设计也避免了请求淹没GUI。)我曾尝试使用计时器,但我不知道如何将其与图形一起使用您不将图形与计时器一起使用。计时器的ActionListener应该调用
repaint()
,这会导致Swing自动调用paintComponent(和其他一些绘制方法)。