THREAD stoppt bzw. schläft nicht!!!!

Unikate

Aktives Mitglied
Java:
public class AppletController extends Applet implements KeyListener{
    private Dog dogArray [];
    private String dogNames;
    private String[]splitBefehle = new String[10];
    private String[] befehle = new String [4];


	public void init(){
		addKeyListener(this);
	}
	
	public void start(){
	    setSize(1000, 800);

	    System.out.println("Bitte geben Sie Hunde ein:");

	    dogArray = new Dog[3];
	    
    	    for (int i = 0; i < dogArray.length; i++){
    	        dogNames = In.readString();
    	        dogArray[i] = new Dog (dogNames, 0, 0);
    	    }  

    	doCommand();
	}
	
	public void paint(Graphics g){  
	    
    for(int i = 0; i < dogArray.length; i++)
        dogArray[i].paintDog(g);  

	}

	public void doCommand(){
        Dog currentDog;
        
        for(int k = 0; k < befehle.length; k++){
            System.out.println("Bitte geben Sie einen beliebigen Hund und Befehl ein");
            befehle[k] = In.readString(); 
            splitBefehle = befehle[k].split(" "); 
    	    for (int h = 0; h < splitBefehle.length; h++){                
                for(int t = 0; t < dogArray.length; t++){
                    if (dogArray[t].getName().equals(splitBefehle[h])){
                           currentDog = dogArray[t];
                           currentDogAktion(currentDog, splitBefehle);
                    }
                }
    	    }
        }
	}
	
	public void currentDogAktion (Dog currentDog, String [] splitBefehle){
	    
    	    for(int h = 0; h < splitBefehle.length; h++){
                if(splitBefehle[h].equals("go")){
                    System.out.println("Bitte geben Sie die Position des Hundes an X:");
                    int xPos = In.readInt();
                    System.out.println("Bitte geben Sie die Position des Hundes an Y:");
                    int yPos = In.readInt();
                    currentDog.go(xPos, yPos);
                } else if(splitBefehle[h].equals("bark")){
                    currentDog.bark();
                } else if(splitBefehle[h].equals("here")){
                    currentDog.here();
                }
    	    }
    	    
	}
....


Mein Problem ist:
Das Programm funktioniert wunderbar, NUR zeichnet mein Appletviewer nur die Veränderung der Hunde an und nicht die Ausgangsposition!
Das bedeutet: Wie rufe ich vor der doCommand() Methode meine paint() methode auf?????
 
Zuletzt bearbeitet:
Grundsätzlich ruft man, wenn man selber neu Zeichnen will nicht paint() , sondern repaint() auf.
In repaint wird unter anderem dann paint() aufgerufen.
 
Sorry, da war ich etwas voreilig mit dem Tippen.

Kapsel das ganze in einen Thread (das Zeichnen der Hunde) und starte den Thread erst am Ende deiner Methode (vielleicht lässt du ihn sogar noch nen paar Sekunden schlafen).
 
ok ich hab mich in threads mal eingelesen.
ich habe es auch geschafft einen zu erstellen.

habe eine neue klasse erstellt, die meine commandos macht usw.

1. frage wie stopp ich den endlosschleifen thread?interruped()?aber wo?
2. mein paint methode zeichnet sich trotzdem noch nicht direkt
 
es sieht nun so aus:

Java:
public class AppletController extends Applet implements KeyListener{
    private Dog dogArray [];
	private String dogNames;
	ThreadKlasse thread;
    
	public void init(){
	    addKeyListener(this);
	    
	}
	
	public void start(){
	    setSize(1000, 800);

	    System.out.println("Bitte geben Sie Hunde ein:");

	    dogArray = new Dog[3];
	    
    	    for (int i = 0; i < dogArray.length; i++){
    	        dogNames = In.readString();
    	        dogArray[i] = new Dog (dogNames, 0, 0);
    	    }        

            thread = new ThreadKlasse();
	    thread.run(dogArray, dogNames);

    	    
	}
	
	public void paint(Graphics g){  
	    
    for(int i = 0; i < dogArray.length; i++)
        dogArray[i].paintDog(g);  
   
	}
}

Java:
public class ThreadKlasse extends Thread {
    private String[]splitBefehle = new String[10];
    private String[] befehle = new String [4];
    
        public void run(Dog dogArray[], String dogNames) {

          while(!isInterrupted()) {    
              
          Dog currentDog;
          
          for(int k = 0; k < befehle.length; k++){
              System.out.println("Bitte geben Sie einen beliebigen Hund und Befehl ein");
              befehle[k] = In.readString(); 
              splitBefehle = befehle[k].split(" "); 
              for (int h = 0; h < splitBefehle.length; h++){                
                  for(int t = 0; t < dogArray.length; t++){
                      if (dogArray[t].getName().equals(splitBefehle[h])){
                             currentDog = dogArray[t];
                             currentDogAktion(currentDog, splitBefehle);
                      }
                  }
              }
          }
          }
        }
       public void currentDogAktion(Dog currentDog, String[]splitBefehle){
                  int xPos;
                  int yPos;
                      for(int h = 0; h < splitBefehle.length; h++){
                          if(splitBefehle[h].equals("go")){
                              System.out.println("Bitte geben Sie die Position des Hundes an X:");
                              xPos = In.readInt();
                              System.out.println("Bitte geben Sie die Position des Hundes an Y:");
                              yPos = In.readInt();
                              currentDog.go(xPos, yPos);
                          } else if(splitBefehle[h].equals("bark")){
                              currentDog.bark(currentDog);
                          } else if(splitBefehle[h].equals("here")){
                              currentDog.here();
                          }
                      }
       }
}
 
OK ich hab es alleine hingekriegt. yeah!
das einzige was noch nicht geht ist, dass mein thread nicht stoppt. das heißt: ich kann meine objekte unendlich lang animieren #zeitnah- das ganze sieht ja schon aus wie ein computerspiel 😀

Kann mir jemand sagen warum die methode nicht schläft verdammt????

Java:
	public void run(){
	    
	    while(true){
	        repaint();
	        
    	    Dog currentDog;
    	    
            for(int k = 0; k < befehle.length; k++){
                System.out.println("Bitte geben Sie einen beliebigen Hund und Befehl ein");
                befehle[k] = In.readString(); 
                splitBefehle = befehle[k].split(" "); 
        	    for (int h = 0; h < splitBefehle.length; h++){                
                    for(int t = 0; t < dogArray.length; t++){
                        if (dogArray[t].getName().equals(splitBefehle[h])){
                               currentDog = dogArray[t];
                               currentDogAktion(currentDog, splitBefehle);
                        }
                    }
        	    }
            }
            
            try
            {
                  Thread.sleep (20);

            }
            catch (InterruptedException ex)
            {

            }
            
        }
	}
 
du startest deinen thread auch garnicht! auch wenn die methode in der von thread geerbten klasse run heißt, wird sie von außen mit start() aufgerufen. ansonsten wird deine methode zwar ausgeführt, aber nur einmal (wie ein simpler methodenaufruf). da es aber eine while(true) schleife ist, läuft diese dauerhaft. abgesehen davon, sleep mit 20 ms aufzurufen dürfte menschlich kaum merkbar sein.

Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 11.2 Threads erzeugen
 
hm, hast du dir meine ersten sätze auch durchgelesen? 🙂

Java:
thread.run(dogArray, dogNames);

der aufruf startet keinen thread, es ist ein einfacher methodenaufruf! dein thread objekt hat diese methode und die wird in einer schleife permanent aufgerufen, aber es existiert keine nebenläufigkeit. (das, was der thread eigentlich tun sollte)

du musst dem objekt die parameter vorher übergeben und dann start() ohne parameter aufrufen! damit erzeugst du einen zweiten thread!
 
klaro hab ich 😀
das ist alter code. hab doch geschrieben, dass ich es hinbekommen hab.
mein thread wird durch thread1.start(); aufgerufen!!!!
 

Zurück
Oben