2016-05-22 24 views
2

Ich möchte zwei Bilder mit Hilfe von Thread neu streichen, aber es immer nur Pan2 repaints. Der Bildschirm zeigt mir blauen Hintergrund und nur ein Bild. Ich habe erwartet, dass zwei Fische schwimmen.Multilingual Thread zum Repaint verwenden paintComponent

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' Gewinde richtig funktionieren, aber pan1s' repaint funktioniert nicht.

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; 
    } 
} 

Antwort

0

Ihr Problem hat nichts mit Threading oder Malerei zu tun und alles mit Layoutmanagern zu tun. Wenn Sie beide Komponenten in einem BorderLayout-verwendenden Container, dem containPane von JFrame, standardmäßig hinzufügen, wird die zweite Komponente die erste Komponente abdecken.

Eine Lösung: Ändern Sie das Layout des Containers, sagen wir zu GridLayout.

Beachten Sie, dass wenn Sie wollen, dass der Fisch zusammen in der gleichen Region schwimmt, dann ist Ihr Setup falsch - Sie sollten nur ein Zeichenfeld haben und der Fisch sollte logische Konstrukte sein, die auf dieser einzelnen Zeichnung gezeichnet sind JPanel, nicht GUI-Konstrukte.

Nebenbei möchten Sie lernen und Java naming conventions verwenden. Variablennamen sollten alle mit einem niedrigeren Buchstaben beginnen, während Klassennamen mit einem Großbuchstaben beginnen. Wenn wir dies lernen und diesem Beispiel folgen, können wir Ihren Code besser verstehen und den Code anderer besser verstehen.

+0

OMG, es funktioniert wirklich, ich bin sehr geschätzt. Und Entschuldigung für meine schlechte Java-Namensgebung, werde ich härter studieren. –