2016-05-22 8 views
2

Я хочу перерисовать две картинки с помощью Thread, но она всегда только repaints pan2. Экран показывает мне синий фон и только одну картину. Я ожидал, что есть две рыбы, плавающие.use mutli thread to repaint 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' Thread работают правильно, но 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; 
    } 
} 

ответ

0

Ваша проблема не имеет ничего общего с нарезкой или окраской, а также с менеджерами макетов. Вы добавляете оба компонента по умолчанию к контейнеру, использующему BorderLayout, в контентную панель JFrame, поэтому второй компонент будет охватывать первый.

Решение: измените расположение контейнера, скажем GridLayout.

Обратите внимание, что если вы хотите, чтобы рыба плавала вместе в одном регионе, ваша настройка неправильная - вам нужно иметь только одну панель чертежа, а рыба должна быть логическими конструкциями, которые нарисованы на этом единственном чертеже JPanel, а не GUI.

В стороне, вы захотите узнать и использовать Java naming conventions. Имена переменных должны начинаться с нижней буквы, а имена классов - с буквой верхнего регистра. Изучение этого и последующее это позволит нам лучше понять ваш код и позволит вам лучше понять код других.

+0

OMG, действительно работает, я очень благодарен. И извините за мое плохое именование Java, я буду учиться усерднее. –

 Смежные вопросы

  • Нет связанных вопросов^_^