Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/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_Multithreading_Paintcomponent_Repaint - Fatal编程技术网

Java 使用多线程重新绘制组件

Java 使用多线程重新绘制组件,java,multithreading,paintcomponent,repaint,Java,Multithreading,Paintcomponent,Repaint,我想使用Thread重新绘制两张图片,但它总是只重新绘制pan2。 屏幕显示蓝色背景,只有一张图片。 我原以为有两只鱼在游泳 import java.awt.*; import java.util.Random; import java.awt.event.*; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import javax.swing.*; public class dem

我想使用Thread重新绘制两张图片,但它总是只重新绘制pan2。 屏幕显示蓝色背景,只有一张图片。 我原以为有两只鱼在游泳

import java.awt.*;
import java.util.Random;
import java.awt.event.*;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.*;

public class demo {

    public static void main(String args[]) throws IOException{
        JFrame frm = new JFrame("sea");
        frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        drawPanel pan = new drawPanel(50,50,1);
        drawPanel pan2 = new drawPanel(100,100,2);

        pan.newThread.start();
        pan2.newThread.start();

        frm.add(pan);
        frm.add(pan2);
        frm.setSize(300, 300);

        frm.setVisible(true);
    }
}
class drawPanel extends JPanel implements Runnable{
    int X,Y,moveX,moveY,dirX=1,dirY=1;
    private Image img_icon;    
    Thread newThread; 
    int a;
    static int width = 300;
    static int height = 300;

    drawPanel (int x,int y,int num) throws IOException {
        File file = new File("fish"+num+".png");
        a= num;
        img_icon = ImageIO.read(file);
        X      = x;                     
        Y      = y;                        

        newThread = new Thread(this);
    }

    public void paintComponent( Graphics g ) {
        super.paintComponent( g );
        this.setBackground( Color.blue );
        g.drawImage(img_icon, X, Y,this);
    }

public void stop(){
    newThread = null;
}
pan1和pan2s的线程工作正常,但pan1s的重新绘制不工作

public void run() {     
    while(newThread != null) 
    {
        repaint();                       

        try
        {
            Thread.sleep(50);
        }
        catch(InterruptedException E){ }

        moveX = dirX*((int)(Math.random()*100)%3);
        moveY = dirY*((int)(Math.random()*100)%3);
        X = X + moveX;
        Y = Y + moveY; 
    }
}

您的问题与线程或绘画无关,而与布局管理器有关。您可以使用容器、JFrame的contentPane以默认方式将这两个组件添加到BorderLayout,因此第二个组件将覆盖第一个组件

解决方案:更改容器的布局,例如更改为GridLayout

请注意,如果您希望鱼在同一区域中一起游动,那么您的设置是错误的——您应该只有一个绘图面板,鱼应该是在单个绘图JPanel上绘制的逻辑结构,而不是GUI结构


作为旁白,你需要学习和使用。变量名都应该以小写字母开头,而类名应该以大写字母开头。了解这一点并遵循这一点将使我们能够更好地理解您的代码,并使您能够更好地理解其他人的代码。

OMG,这确实有效,我非常感谢。很抱歉我的Java命名不好,我会更加努力学习。