Thread probleme beim repainten

Kakarott

Mitglied
habe hier 3 Klassen davon erben 2 von Threads. Nur will die eine nicht die paint() aufrufen der System.out.print den ich in die run() einbaute zeigt das es aber den wert erhöht. Wenn ich den Quelltext aus der Datei Gegner in die andere einbaue dann geht das, warum geht das nicht so wie ich es geschrieben habe.
Code:
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.io.IOException;

import javax.swing.JFrame;



public class Main extends Thread{

	public DrawPanel dp;	
	JFrame jf;
	Thread th = null;
	
	
	public Main() throws IOException {
		dp = new DrawPanel();
		jf  = new JFrame();
		jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		jf.setSize(800, 800);
		jf.setLocation(100, 100);
		jf.add(dp);
		//th = new Thread();
		jf.addKeyListener( new KeyAdapter() {
			public void keyPressed( KeyEvent e ) {
				switch(e.getKeyChar()){
					case 's':
						dp.el2dmensch.setFrame(dp.el2dmensch.getX(), dp.el2dmensch.getY()+2, dp.w, dp.h);
						dp.el2dmenschrand.setFrame(dp.el2dmenschrand.getX(), dp.el2dmenschrand.getY()+2, dp.w-2, dp.h-2);
						//den schuss immer unter dem Körper mitbewegen
						dp.el2dschuss.setFrame(dp.el2dschuss.getX(), dp.el2dschuss.getY()+2, dp.el2dschuss.getWidth(), dp.el2dschuss.getHeight());
						dp.repaint();
						break;
						
					case 'w':
						dp.el2dmensch.setFrame(dp.el2dmensch.getX(), dp.el2dmensch.getY()-2, dp.w, dp.h);
						dp.el2dmenschrand.setFrame(dp.el2dmenschrand.getX(), dp.el2dmenschrand.getY()-2, dp.w-2, dp.h-2);
						dp.repaint();
						break;
					case 'a':
						dp.el2dmensch.setFrame(dp.el2dmensch.getX()-2, dp.el2dmensch.getY(), dp.w, dp.h);
						dp.el2dmenschrand.setFrame(dp.el2dmenschrand.getX()-2, dp.el2dmenschrand.getY(), dp.w-2, dp.h-2);
						dp.repaint();
						break;
					case 'd':
						dp.el2dmensch.setFrame(dp.el2dmensch.getX()+2, dp.el2dmensch.getY(), dp.w, dp.h);
						dp.el2dmenschrand.setFrame(dp.el2dmenschrand.getX()+2, dp.el2dmenschrand.getY(), dp.w-2, dp.h-2);
						dp.repaint();
						break;
					//feuern eines schusses in form eines striches oder kreises
					case ' ':
						start();
						break;		
				}	 
			} 
			public void keyReleased( KeyEvent e ) {
					 
			}
			public void keyTyped(KeyEvent e) {
				// TODO Auto-generated method stub
				
			} 
			}
		);
		
		jf.setVisible(true);
		
	}
	
	public static void main(String[] args) throws IOException {
		 new Main();
		Thread t = new Thread(new Gegner());
		t.start();
	}
	
	
	 public void start()
	  {
	    if (th == null)
	    {
	      th = new Thread(this);
	      th.start();
	    }
	  }
	
	public void run() {
		
		while(dp.el2dschuss.getX()>=0){
			
			dp.el2dschuss.setFrame(dp.el2dschuss.getX(), dp.el2dschuss.getY()-10, dp.el2dschuss.getWidth(), dp.el2dschuss.getHeight());
			dp.repaint();
			if(dp.el2dmensch.contains(dp.el2dschuss.getX(), dp.el2dschuss.getY()))
				System.out.println("Treffer");
			try {
				th.sleep(100);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

	
}
Code:
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.MediaTracker;
import java.awt.Toolkit;
import java.awt.geom.Ellipse2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JPanel;

class DrawPanel extends JPanel{
	
	//koordinaten des menschen 
	int x = 200;
	int y = 500;
	final static int h = 30;
	final static int w = 30;
	//koordinaten des Schusses
	int sx = 165;
	int sy = 55;
	
	//Mensch
	Ellipse2D el2dmensch;
	Ellipse2D el2dmenschrand;
	//schuss des Spielers
	Ellipse2D el2dschuss;
	//Gegner 3 x
	Ellipse2D gegner1;
	
	
	BufferedImage image = null;
	
	
	
	public DrawPanel() throws IOException {
		//getBackgroundImage();
		el2dmenschrand = new Ellipse2D.Double(x+1, y+1, w-2, h-2);
		el2dmensch = new Ellipse2D.Double(x, y, w, h);
		el2dschuss = new Ellipse2D.Double(el2dmenschrand.getCenterX(),el2dmenschrand.getCenterY(),10,10);
		gegner1 = new Ellipse2D.Double(40, 50, 15, 15);
		File f = new File("background.jpg");
		image = ImageIO.read(f);

	}
	
	@Override 
	protected void paintComponent( Graphics g ) {
		super.paintComponent( g );
		Graphics2D g2 = (Graphics2D) g;
		g2.drawImage(image, 0, 0, this);
		g2.setStroke(new BasicStroke(3));
		g2.draw(el2dmensch);
		g2.setColor(Color.BLUE);
		g2.fill(el2dmenschrand);
		g2.fill(el2dschuss);
		//farbe gegner setzten und die gegner zeichnen
		g2.setColor(Color.GREEN);
		g2.fill(gegner1);
		
		
	}
	
			
	}
Code:
import java.io.IOException;


public class Gegner extends Thread{
	
	DrawPanel dp;
	
	public Gegner() throws IOException {
		dp = new DrawPanel();
		//start();
	}

	public void run() {
		System.out.println(dp.gegner1.getY());
		while(dp.gegner1.getY()<=300){
			dp.gegner1.setFrame(dp.gegner1.getX(), dp.gegner1.getY()+4, dp.gegner1.getWidth()+30, dp.gegner1.getHeight()+30);
			System.out.println(dp.gegner1.getY());
			dp.repaint();
			
			try {
				this.sleep(100);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}
	}
	
	public int anzahlGegner(){
		int i = (int)(Math.random()*3);
		return i;
	}
	
	
	
	
}

thx
 
Sorry, wenn ich den Thread nochmal anreise.
Nach eigender Erfahrung, macht repaint() in einem Thread immer Probleme. Mit paintImmediately(int x, int y, int whidt, int high) müsste es klappen.
 
Zurück