# sich bewegende grafische Objekte



## Kampfzwereg (15. Jan 2012)

Hallo zusammen,

weiß jemand wo ich mir Wissen über grafische Objekte aneignen kann?
Hab zwar bei "Java ist auch einen Insel" geguckt, da steht aber ziemlich viel und nichts konkretes. 

Ich würde gernen (ganz simpel) einen Ball erzeugen, der von A nach B läuft.

Lg Kampfzwerg


----------



## njans (15. Jan 2012)

Redest du von 3D Animationen oder von "simplen" 2D Grafiken?


----------



## pro2 (15. Jan 2012)

Das ist gar nicht so schwer. Da musst du einfach nur einen Kreis zeichnen, der sich dann bewegt. 

Du kannst dir ja mal das hier ansehen: http://www.java-forum.org/spiele-multimedia-programmierung/54795-quaxli-2d-spiele-tutorial.html
Dort findest du das notwendige Wissen, wie so etwas am besten aufgebaut wird und wie man z.B. Objekte zeichnet


----------



## Gast2 (15. Jan 2012)

http://www.java-forum.org/awt-swing-swt/43939-zeichnen-swing-tutorial.html
Das kann man sich mal durchlesen, ansonsten einfach mal nach Java Swing Tutorial googlen.


----------



## Kampfzwereg (15. Jan 2012)

so schnell schonAntworten wow ....

@njans: nur 2d. Ganz simpel.

@All: also ich werd mir mal die Linksdurchlesen. Danke schonmal. Is das generell denn schwierig oder muss man sich da erst ne Woche reinfuchsen?


----------



## pro2 (15. Jan 2012)

Ach um einen Kreis zu zeichnen, der sich z.B. erstmal auf Knopfdruck bewegt, brauchst du, wenn du dich z.B. mit Java auskennst, aber den Rest noch lesen musst, vielleicht ne Stunde +- (und das ist viel Zeit )


----------



## HimBromBeere (15. Jan 2012)

Das schwierigste dürfte dabei sein, einen Ball als Bild zu zeichnen  (je nach Komplexitätsgrad desselben, handelt es sich nur um eine Kugel oder soll der Ball auch sowas wie eine Textur beinhalten?)
der Rest geht dann recht schnell...


----------



## Kampfzwereg (15. Jan 2012)

ja es soll nur wirklich ne ganz simple Kugel sein, die sich ein stück nach rechts bewegt, kurz anhält und sich weiter bewegt.denke dann, dass das machbar ist ;-)  
wenn ich schonmal dabei bin , werf ich dass, wenn erlaubt, auch kurz hinterher : 
gibt es einen befehl , der ein programm x Sekunden lang warten lässt, ohne aus mehr als zig Zeilen zu bestehen. Hab son bissel rumgestöbert, und das muss man teilweise ganzen Methoden entwerfen. 
Hab zwar sone Methode gefunden : thread.wait(x)" aber die funzt irgendwie nciht wirklich.


----------



## Gast2 (15. Jan 2012)

```
try {
  Thread.sleep(x);
} catch (InterupptedException ie) {
  // dont care...
}
```


----------



## Kampfzwereg (15. Jan 2012)

und da muss ich nix importen?


----------



## HimBromBeere (15. Jan 2012)

Nö, Thread ist eine Java Standard-Klasse...


----------



## Kampfzwereg (15. Jan 2012)

ok danke mal wieder  
dann wär das geklärt.

Lg Kampfzwerg


----------



## Kampfzwereg (17. Jan 2012)

Hey ich bins nochmal.

Also ich hab mich da nen bisschen durchgewuselt und bin zu dem Ergebnis gekommen:
Ich hab nen jFrame(Flughafen) der ne Queue hat die Nods kennt. In denen werden dann Objecte des Typs Flugzeug gespeichert. 
Im jFrame hab ich nen Methode run() , die durchgehend ausgeführt wird.


```
public  void run()
  {
    while(true)
    {
      zaehler++;
      repaint();
      waiting(1);
    }
  }
```

Dann noch die Methode paint() die (erst) eine einfach Linie zeichnet.

```
public void paint(Graphics g)
  {
     super.paint(g);
     {
       g.drawOval(zaehler,100,10,10);
     }
  }
```

Und die die Methode waiting() ,die eigentlcih erstmal nicht so wichtig ist.

```
public static void waiting (int n)
{
     long t0, t1;
     t0 =  System.currentTimeMillis();
     do
    {
        t1 = System.currentTimeMillis();
     }while ((t1 - t0) < (n ));
}
```

Problem: 
1:Es wird nur ein Kreis gezeichnet und nicht "mehrere" die durch das Bild wandern.

2:Außerdem würd ich gerne das ganze auf Knopfdruck mahcen. Also beim ActionPerformed.

3: Das Weiteren würd ich gerne Wissen ob man mehrere Kreise gleichzeitig durchs Bild laufen lassen kann(also versetzt).Das bedeutet, dass man , wenn man das auf einen FLughafen bezieht, einen Kreis8Fleugzeug, was sich gerade bewegt(Bildlichauf einen Landebahn) und gleichzeitig 4 weitere Kreise, die sich im Kreis bewegen und sozusagen warten, bis der erste Kreis nen bestimmten Pixel/Koordinate erreicht hat. Hat da einer nen Lösungsansatz?

LG Kampfzwerg


----------



## HimBromBeere (17. Jan 2012)

Ich seh hier auch nur einen Kreis 





> ```
> g.drawOval(zaehler,100,10,10);
> ```


Wie sollen damit mehrere Kreise gezeichnet werden?`Is ja nur einer, der in x-Richtung wandert...
Willst du mehrere Kreise zeichnen, musst du dein .drawOval halt auch mehrmals ausführen... einmal pro Ellipse (das ist es ja genaugenommen...)


----------



## Kampfzwereg (17. Jan 2012)

mit mehreren Kreisen mei nich einen der auf der x-Achse wandert. sind ja im Grunde ganz viele Kreise , die halt immer gelöscht werden. Aber der bewegt sich halt nicht. Das ist das prob


----------



## Gast2 (17. Jan 2012)

Lass dir dann halt mal zähler (umlaute vermeiden!!) in der paint Methode ausgeben, ändert sich der Wert da?


----------



## HimBromBeere (17. Jan 2012)

Wird denn run() auch ausgeführt (ist dein Thread überhaupt gestartet)?


----------



## Kampfzwereg (17. Jan 2012)

hmmm....ich hab mit 

```
System.out.println(""+zaehler);
```

probiert was auszugeben. da kommt aber nix?!

Warum soll run nicht ausgeführt werden?. wird das nicht einfach so wegen dem While(true)?


----------



## HimBromBeere (17. Jan 2012)

run() läuft nur, wenn deine Klasse das Interface Runnable implementiert UND der Thread mit Klasse.start() gestartet wurde... 

EDIT: Dafür erstellst du einfach ´nen neuen Therad im Konstuktor deiner Klasse:

```
Thread t = new Thread(this);
t.start();
```

Nachdem du das getan hast, wird run() auch wirklich ausgeführt...


----------



## Kampfzwereg (17. Jan 2012)

wo schreib ich denn das "start" hin...? also in den Konstruktor?

vor allem ...was soll das "this" als Parameter? Ich meine Klasse Flughafen hat keine Parameter die übergeben werden müssen?!


----------



## Gast2 (17. Jan 2012)

Wenn deine Klasse Runnable implementiert: 
	
	
	
	





```
new Thread(deinRunnable).start();
```


----------



## Kampfzwereg (17. Jan 2012)

```
Compiliere L:\Schule\Informatik\Projekte JavaE\Flughafen\Flughafen.java mit Java-Compiler
Flughafen.java:20:22: error: no suitable constructor found for Thread(Flughafen)
  private Thread t = new Thread(this);
                     ^
    constructor Thread.Thread(ThreadGroup,Runnable,String,long) is not applicable
      (actual and formal argument lists differ in length)
    constructor Thread.Thread(ThreadGroup,Runnable,String) is not applicable
      (actual and formal argument lists differ in length)
    constructor Thread.Thread(Runnable,String) is not applicable
      (actual and formal argument lists differ in length)
    constructor Thread.Thread(ThreadGroup,String) is not applicable
      (actual and formal argument lists differ in length)
    constructor Thread.Thread(String) is not applicable
      (actual argument Flughafen cannot be converted to String by method invocation conversion)
    constructor Thread.Thread(ThreadGroup,Runnable) is not applicable
      (actual and formal argument lists differ in length)
    constructor Thread.Thread(Runnable) is not applicable
      (actual argument Flughafen cannot be converted to Runnable by method invocation conversion)
    constructor Thread.Thread() is not applicable
      (actual and formal argument lists differ in length)
Flughafen.java:30:10: error: call to super must be first statement in constructor
    super(title);
         ^
2 errors
```

Das ist die Fehlermeldung btw. Ich hab
das Thread am anfang initialisiert

```
private Thread t = new Thread(this);
```

und den Befehl 

```
t.start();
```
 in den Konstruktior geschrieben


----------



## HimBromBeere (17. Jan 2012)

> Flughafen.java:30:10: error: call to super must be first statement in constructor


Was sagt dir diese zeile???


----------



## Kampfzwereg (17. Jan 2012)

ja da hab ich wohl nich nachgedacht :-] sry...

aber trotzdem...auch wenn ich das korrigiere spuckt er mir das aus:

```
constructor Thread.Thread(ThreadGroup,Runnable,String,long) is not applicable
      (actual and formal argument lists differ in length)
    constructor Thread.Thread(ThreadGroup,Runnable,String) is not applicable
      (actual and formal argument lists differ in length)
    constructor Thread.Thread(Runnable,String) is not applicable
      (actual and formal argument lists differ in length)
    constructor Thread.Thread(ThreadGroup,String) is not applicable
      (actual and formal argument lists differ in length)
    constructor Thread.Thread(String) is not applicable
      (actual argument Flughafen cannot be converted to String by method invocation conversion)
    constructor Thread.Thread(ThreadGroup,Runnable) is not applicable
      (actual and formal argument lists differ in length)
    constructor Thread.Thread(Runnable) is not applicable
      (actual argument Flughafen cannot be converted to Runnable by method invocation conversion)
    constructor Thread.Thread() is not applicable
      (actual and formal argument lists differ in length)
```

also irgendwas ist nicvht anwendbar. aber warum und wieso?


----------



## HimBromBeere (17. Jan 2012)

Deine Klasse Flughafen muss dazu das Interface Runnable impmenetieren:

```
public class Flughafen extends ... implements Runnable {
    public void run() {...}
}
```


----------



## darkeye2 (17. Jan 2012)

ist eigendlich ganz einfach:
(musst halt alles andere noch ergänzen, ist nur der grundrahmen fürs prog)

```
public class Flughafen extends JFrame implements Runnable{

 public Flughafen(){
     super("Beispiel Flughafen");
     this.setSize(new Dimension(600,450));
     new Thread(this).start();
 }

 public void run(){
    //bzw ist es eigendlich besser, wenn du statt while(true) for(;;) verwendest, bewirkt das gleiche
   
   while(true){
      //dein code, der die kriese, usw zeichnet
   }
 }

 public static void main(String[] args){
   new Flughafen();
 }

}
```


EDIT: für Dimension musst du was importieren, hab grad leider keine zeit nachzusehen, was genau, aber google sagts schnell (oder die docu) (oder du weißt es, oder verwendest eclipse^^)


----------



## Kampfzwereg (17. Jan 2012)

ok also errors kommen schonmal keine mehr 
ein kleines Problemchen hab ich noch. Ein Ball bewegt sich zwar von links nach rechts , aber nur wenn ich die Maus über den Button im Bild bewege wird der Kreis sichtbar.


 Aber warum ist denn for(;; )sinnvoller ? was ist der genaue unterschied? Andere Laufzeit?

WObei ich auch 
	
	
	
	





```
this.setSize(new Dimension(600,450));
```
 das weglasse.


----------



## HimBromBeere (17. Jan 2012)

> Aber warum ist denn for(;; )sinnvoller ? was ist der genaue unterschied? Andere Laufzeit?


Wo haste denn das her?! 
	
	
	
	





```
for(;;)
```
 ist genau das gleiche wie 
	
	
	
	





```
while(true)
```
, sprich eine Endlosschleife.

EDIT: Habs gefunden... dass das sinnvoller sein soll, halte ich aber für ein Gerücht, lasse mich aber gerne mit logischen Gründen korrigieren...


----------



## Kampfzwereg (17. Jan 2012)

> bzw ist es eigendlich besser



desswegen dachte ich vllt die Laufzeit sei besser.... noch ne Idee zu meinem Prob?


----------



## pro2 (17. Jan 2012)

for loop - Java: for(; vs. while(true) - Stack Overflow

Die 1. Antwort zeigt den Unterschied (;-))


----------



## HimBromBeere (17. Jan 2012)

Also ich seh da nur, dass die erzeugten Bytecodes vollkommen identisch sind, von Unterschieden keine Spur... bin ich blind?!


----------



## Kampfzwereg (17. Jan 2012)

ich auch ^^


----------



## darkeye2 (17. Jan 2012)

wegen  while(true) und for(;:
das ist seit java 1.4 nach dem compilieren das gleiche, aber in allen referenzen wird man für endlosschleifen die for wariante finden, da diese eigendlich eleganter ist, aber das ist hier nur nebensächlich. 

Zum problem des  TO:
poste doch mal bitte deinen kompletten code, dein button müsste eigendlich nur eine variable auf true setzen, und in deiner game loop prüfst du, ob variable true, wenn ja wird ausgeführt (ball bewegt sich) wenn false wird nicht ausgeführt.

bei deinem button müsste in actionPerformed stehen:
moveBalls = !moveBalls;  //einfach den wert der variable moveBalls (type boolean) umdrehen, also beim ersten klick startet die animation und beim zweiten stoppt sie

im game loop:
if(moveBalls){
  //code, der deinen ball bewegt
}

in der paintComponent methode:
super.paintComponent(g);
//restelicher code, um deine bälle zu zeichnen
//fals das nicht funktioniert, füge noch ein super.paintComponents(g); hinzu


----------



## HimBromBeere (17. Jan 2012)

> das ist seit java 1.4 nach dem compilieren das gleiche, aber in allen referenzen wird man für endlosschleifen die for wariante finden, da diese eigendlich eleganter ist, aber das ist hier nur nebensächlich.



Eleganter? Naja, Ansichtssache... ich persönlich finde while(true) leichter lesbar als for(; (hihi... nichtmal der Texteditor des Forums kann das lesen...), letzteres sieht aus wie ein Sprachfehler, als würde jemand stottern, nur halt ein Programmierer :lol:

Naja, wie auch immer. 
Wie mein Vorredner bereits erwähnt hat, musst du bei Button-Klick (actionPerformed) eine boolean-Variable umschalten, am einfachsten natürlich mit 
	
	
	
	





```
bRunning = !bRunning
```
. Diese Variable wird dann in run geprüft, fertig...


----------



## Kampfzwereg (18. Jan 2012)

auf den Trick mit dem Attribut was wechselt bin ich auch gekommen. aber das is ja nicht das Problem. mein Prob ist, dass ich den sich bewegenden Ball nur sehe , wenn ich mit den Cursor über den Buton gehe.

```
public class Flughafen extends JFrame implements Runnable {
  // Anfang Attribute

  private boolean ausloeser = false;
  private JButton jButton1 = new JButton();
  private int zaehler=0;
  private Thread t = new Thread(this);

  // Ende Attribute

  public Flughafen(String title) {
    // Frame-Initialisierung
    super(title);
    t.start();
    setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    int frameWidth = 300;
    int frameHeight = 300;
    setSize(frameWidth, frameHeight);
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (d.width - getSize().width) / 2;
    int y = (d.height - getSize().height) / 2;
    setLocation(x, y);
    Container cp = getContentPane();
    cp.setLayout(null);

    // Anfang Komponenten

    jButton1.setBounds(0, 208, 281, 57);
    jButton1.setText("jButton1");
    jButton1.setMargin(new Insets(2, 2, 2, 2));
    jButton1.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        jButton1_ActionPerformed(evt);
      }
    });
    cp.add(jButton1);
    // Ende Komponenten

    setResizable(false);
    setVisible(true);
  }

  // Anfang Methoden
  public  void run()
  {
    while(true)
    {
      repaint();
      zaehler++;
      waiting(100);
    }
  }

  public void paint(Graphics g)
  {
     super.paint(g);

     {
       g.drawOval(zaehler,100,10,10);
     }
  }  
  
  public static void waiting (int n){

        long t0, t1;

        t0 =  System.currentTimeMillis();

        do{
            t1 = System.currentTimeMillis();
        }
        while ((t1 - t0) < (n ));
    }
  public void jButton1_ActionPerformed(ActionEvent evt)
  {

  }

  // Ende Methoden

  public static void main(String[] args)
  {
    new Flughafen("Flughafen");

  }
}
```


----------



## darkeye2 (18. Jan 2012)

also du tust ja eigenldich  nix, wenn du auf den button kommst, aber hier mal der (etwas) korigierte code, probier mal, ob das geht:

//du must auf dem button klicken, damit sich der ball bewegtt, beim erneuten anklicken steht er still, und kann wieder mit button gestartet werden


```
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Insets;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;


public class Flughafen extends JFrame implements Runnable {
	  // Anfang Attribute
	 
	  private boolean ausloeser = false;
	  private JButton jButton1 = new JButton();
	  private int zaehler=0;
	  private Thread t = new Thread(this);
	 
	  // Ende Attribute
	 
	  public Flughafen(String title) {
	    // Frame-Initialisierung
	    super(title);
	    t.start();
	    this.setDefaultCloseOperation(EXIT_ON_CLOSE);
	    int frameWidth = 300;
	    int frameHeight = 300;
	    setSize(frameWidth, frameHeight);
	    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
	    int x = (d.width - getSize().width) / 2;
	    int y = (d.height - getSize().height) / 2;
	    setLocation(x, y);
	    Container cp = getContentPane();
	    cp.setLayout(null);
	 
	    // Anfang Komponenten
	 
	    jButton1.setBounds(0, 208, 281, 57);
	    jButton1.setText("jButton1");
	    jButton1.setMargin(new Insets(2, 2, 2, 2));
	    jButton1.addActionListener(new ActionListener() {
	      public void actionPerformed(ActionEvent evt) {
	        jButton1_ActionPerformed(evt);
	      }
	    });
	    cp.add(jButton1);
	    // Ende Komponenten
	 
	    setResizable(false);
	    setVisible(true);
	  }
	 
	  // Anfang Methoden
	  public  void run()
	  {
	    while(true)
	    {
	      this.validate();
	      this.repaint();
	      if(ausloeser)
	        zaehler++;
	      if(zaehler > this.getSize().width) //prüfen ob ball aus dem fenster raus ist
	    	  zaehler = -3;                    //ball auf der anderen seite wieder ins fenster bringen
	      waiting(100);
	    }
	  }
	 
	  public void paint(Graphics g)
	  {
	     super.paint(g);
	 
	     {
	    	 g.drawOval(zaehler,100,10,10);
	     }
	  }  
	  
	  public static void waiting (int n){
	 /*
	        long t0, t1;
	 
	        t0 =  System.currentTimeMillis();
	 
	        do{
	            t1 = System.currentTimeMillis();
	        }
	        while ((t1 - t0) < (n ));
            */
			try {
				Thread.sleep(n);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
	    }
	  public void jButton1_ActionPerformed(ActionEvent evt)
	  {
		  ausloeser = !ausloeser;
	  }
	 
	  // Ende Methoden
	 
	  public static void main(String[] args)
	  {
	    new Flughafen("Flughafen");
	 
	  }
	}
```


----------



## HimBromBeere (18. Jan 2012)

Übrigens: du solltest, wenn du schon Swing nutzt, nicht Paint, sondern paintComponent() überschreiben, damit Java die Möglichkeit, alle anderen Komponenten zu zeichnen...


----------



## Kenan89 (18. Jan 2012)

Mal eine Frage: Was für einen Sinn hat es, in Java zu zeichnen? Ich meine z.B. gerade Striche?
Bin Anfänger und habe keine Vorstellung momentan, wozu das in der Praxis nutzvoll sein soll.


----------



## HimBromBeere (18. Jan 2012)

Hmmmmm... warum könnte man wohl zeichnen wollen? Vlcht. weil im Büro gerade das Papier aus gegangen ist? 

Ne, ehlich: wenn du z.B. ein Spiel schreiben willst, bei dem sich ein Strichmännchen bewegt? Oder weil du eine Zeichenanwendung schreiben willst? Warum fragst du, warum Menschen zeuchnen, da kannst du sie auch gleich fragen, warum Programmierer programmieren!


----------



## darkeye2 (18. Jan 2012)

@HimBromBeere:
 da hast du natürlich recht, hab bei der korrektur seines codes gar nicht drauf geachtet. werde es mal ausbessern

EDIT: kann meinen beitrag von heute frühs nicht mehr editieren ... also muss der TO das wohl selber ausbessern

@Kenan89:
 es gibt viele anwendungen, wo du was zeichnen musst, wenn du spiele machst sowieso, wenn du graphische auswertungen von statistiken hast, musst du auch zeichnen, wenn du chemische/ mathematische gleichungen/ formeln darstellst, ist es oft auch nötig lienien usw. zeichnen zu können, ... . Da gibt es sehr sehr viel anwendungsmöglichkeit, ist halt wie in jeder anderen programmiersprache, das ganze graphische zeug wird ja auch gezeichnet!


----------



## Kenan89 (18. Jan 2012)

Nein, du hast mich falsch verstanden. In Java kann man doch drawLine einsetzen und eine linie ziehen lassen. Aber das kann man auch in einem Grafik programm machen und das Bild in Java einsetzen.

EDIT: Ah Ok zum Auswerten von Statistiken. Die Grafik zeichnet sich je nach Statistikenlage. Das wäre natürlich sinnvoll ja. Mir sind spontan nur keine Anwendungsbeispiele eingefallen.


----------



## Kampfzwereg (18. Jan 2012)

das ist die Vorstufen von komplexeren Zeichnen. Diese Linie ist später, wenn du gut bist, keine Linie mehr sonder ein animierter Mensch(etc was auch immer)....

@Darkeye2 danke! ich probiers nach der Arbeit mal aus . Die sache war... mein Prob ist nicht , dass der die Methode nicht ausführt wenn ich den buton klicke, sonder wenn ich sie ausführe und mit dem Cursor über den Butten gehe (NICHT KLICKE) man nur dann den sich bewegenden Kreis sieht. 
DAS is das eigentliche Prob. hab den button da eig nur so drin bis jetzt. weiß schon, dass der nix macht.

Aber genauere Infos gibts, wenn ich das Prog später mal ausprobiert hab. ;-) danke trotzdem


----------



## darkeye2 (18. Jan 2012)

das probleme sollte durch das 
this.validate() behoben werden, und du solltest, wie vorhin schon gesagt wurde nicht paint(Graphics g) überschreiben sondern
public void paintComponent(Graphics g){
   super.paintComponent(g);
   //dein code zum zeichnen
}


----------



## Kampfzwereg (18. Jan 2012)

ok. das mit dem Validate() hab ich wohl übersehen. wie gesagt ich guck in mir erst heute abend richtig an , den Code. Bin dann mal wech. danke trotzdem
lg


----------



## Kampfzwereg (18. Jan 2012)

okay... also ich seh immer noch die Linien von letzten Versuch und krieg die nicht weg. der Kreis bewegt sich aber auch nicht. 
hab mir den Quellcode angeguckt. müsste aber eigentlich funktionieren ....


----------



## Gast2 (18. Jan 2012)

> okay... also ich seh immer noch die Linien von letzten Versuch und krieg die nicht weg.


Dann hast du den super.paintComponent aufruf vergessen.


----------



## Kampfzwereg (18. Jan 2012)

ich hab das ganze noch mit paint() . ich änder das m,al gerade. dürfte aber daran nicht liegen

@Darkeye2   


> und du solltest, wie vorhin schon gesagt wurde nicht paint(Graphics g) überschreiben sondern
> public void paintComponent(Graphics g){
> super.paintComponent(g);
> //dein code zum zeichnen
> }



das funzt nicht. muss man dafür irgendwas  importieren ? weil er sagt mir immer cannot find symbol....


----------



## darkeye2 (18. Jan 2012)

also ich weiß nicht, woran das bei dir liegt

probier mal folgenden code:
(einfach komplett kopieren, wenn du mit einem normalen texteditor arbeitest, vergiss nicht, erneut zu kompilieren!!)
(wenn das immer noch nicht geht, bitte mach einen screenshot, damit wir wissen, was genau bei dir schief läuft)

```
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Insets;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;


public class Flughafen extends JFrame implements Runnable {
	  // Anfang Attribute
	 
	  private boolean ausloeser = false;
	  private JButton jButton1 = new JButton();
	  private JPanel zeichenPanel;
	  private int zaehler=0;
	  private Thread t = new Thread(this);
	 
	  // Ende Attribute
	 
	  public Flughafen(String title) {
	    // Frame-Initialisierung
	    super(title);
	    zeichenPanel = new JPanel(){
	    	public void paintComponent(Graphics g){
	    		super.paintComponent(g);
	    		g.drawOval(zaehler,100,10,10);
	    	}
	    };
	    zeichenPanel.setBounds(0, 0, 300, 300);
	    
	    zeichenPanel.setPreferredSize(new Dimension(300, 300));
	    t.start();
	    this.setDefaultCloseOperation(EXIT_ON_CLOSE);
	    int frameWidth = 300;
	    int frameHeight = 300;
	    setSize(frameWidth, frameHeight);
	    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
	    int x = (d.width - getSize().width) / 2;
	    int y = (d.height - getSize().height) / 2;
	    setLocation(x, y);
	    Container cp = getContentPane();
	    cp.setLayout(null);
	    cp.add(zeichenPanel);
	 
	    // Anfang Komponenten
	 
	    jButton1.setBounds(0, 208, 281, 57);
	    jButton1.setText("jButton1");
	    jButton1.setMargin(new Insets(2, 2, 2, 2));
	    jButton1.addActionListener(new ActionListener() {
	      public void actionPerformed(ActionEvent evt) {
	        jButton1_ActionPerformed(evt);
	      }
	    });
	    zeichenPanel.add(jButton1);
	    // Ende Komponenten
	 
	    setResizable(false);
	    setVisible(true);
	  }
	 
	  // Anfang Methoden
	  public  void run()
	  {
	    while(true)
	    {
	      this.validate();
	      this.repaint();
	      if(ausloeser)
	        zaehler++;
	      if(zaehler > this.getSize().width)
	    	  zaehler = -3;
	      waiting(100);
	    }
	  } 
	  
	  public static void waiting (int n){
	   /*
	        long t0, t1;
	 
	        t0 =  System.currentTimeMillis();
	 
	        do{
	            t1 = System.currentTimeMillis();
	        }
	        while ((t1 - t0) < (n ));
	        */
			try {
				Thread.sleep(n);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
	    }
	  public void jButton1_ActionPerformed(ActionEvent evt)
	  {
		  ausloeser = !ausloeser;
	  }
	 
	  // Ende Methoden
	 
	  public static void main(String[] args)
	  {
	    new Flughafen("Flughafen");
	 
	  }
	}
```


----------



## Kampfzwereg (19. Jan 2012)

ich habs jetzt nochmal probiert. funzt auch alles. nur eine Sache nich. glaub da hab ich nen Fehler beim Type Cast gemacht. Kannste dir mal angucken.


```
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.awt.image.*;
import javax.imageio.*;
import java.io.*;
/**
  *
  * Beschreibung
  *
  * @version 1.0 vom 15.01.2012
  * @author
  */
public class Flughafen extends JFrame implements Runnable {
  // Anfang Attribute
  private Thread t = new Thread(this);
  private BufferedImage imgHintergrund = null;
  private JLabel jLzeit = new JLabel();
  private BufferedImage imgFlugzeug = null;
  private boolean besetzt= false;
  private QueueNEU schlange = new QueueNEU();
  private JButton jBplus = new JButton();
  private int FlugzeugeZuErstellen=0;
  // Ende Attribute
  public Flughafen(String title) {
    // Frame-Initialisierung
    super(title);
    t.start();
    setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    int frameWidth = 480;
    int frameHeight = 320;
    setSize(frameWidth, frameHeight);
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (d.width - getSize().width) / 2;
    int y = (d.height - getSize().height) / 2;
    setLocation(x, y);
    Container cp = getContentPane();
    cp.setLayout(null);
    // Anfang Komponenten
    jLzeit.setBounds(112, 200, 46, 24);
    jLzeit.setText("Zeit:");
    jLzeit.setFont(new Font("MS Sans Serif", Font.PLAIN, 18));
    cp.add(jLzeit);
    jBplus.setBounds(64, 224, 129, 33);
    jBplus.setText("Flugzeug hinzufügen");
    jBplus.setMargin(new Insets(2, 2, 2, 2));
    jBplus.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        jBplus_ActionPerformed(evt);
      }
    });
    cp.add(jBplus);
    // Ende Komponenten

    setResizable(false);
    setVisible(true);
  }

  // Anfang Methoden
  public  void run()
  {
    while(true)
    {
       try
       {
       imgFlugzeug = ImageIO.read(new File("img/flugzeugneu2.png"));
       imgHintergrund = ImageIO.read(new File("img/hintergrund.jpg"));
       }
       catch(IOException e)
       {

       }
       repaint();
       if(FlugzeugeZuErstellen>0)
       {
          schlange.enqueue(new Flugzeug(1+(int)(Math.random()*1),0));
          FlugzeugeZuErstellen--;
       }

       if(((Flugzeug)schlange.front()).getPos()<480)
       {
          if(!besetzt)
          {
            if(((Flugzeug)schlange.front()).getPos()<400)
            {
               ((Flugzeug)schlange.front()).setPos(((Flugzeug)schlange.front()).getPos()+1);
            }
            else
            {
               ((Flugzeug)schlange.front()).setZeitZaehler(((Flugzeug)schlange.front()).getZeitZaehler()+1);
            }

          }
          else
          {
            if(((Flugzeug)schlange.front()).getPos()<400)
            {
              ((Flugzeug)schlange.front()).setPos(((Flugzeug)schlange.front()).getPos()+1);
            }
          }
       }
       else
       {
         schlange.dequeue();
       }


       this.waiting(10);
    }
  }


  public void paint(Graphics g)
  {
     super.paint(g);
     {
       g.drawImage(imgHintergrund,0,0,this);
       g.drawImage(imgFlugzeug,((Flugzeug)schlange.front().getNext().getPos()),155,this);
       g.drawImage(imgFlugzeug,((Flugzeug)schlange.front().getNext().getPos()),155,this);
     }

  }
  
  public static void waiting (int n)
  {

        long t0, t1;

        t0 =  System.currentTimeMillis();

        do{
            t1 = System.currentTimeMillis();
        }
        while ((t1 - t0) < (n)*1000);
   }

  public void jBplus_ActionPerformed(ActionEvent evt)
  {

  }

  // Ende Methoden

  public static void main(String[] args)
  {
    new Flughafen("Flughafen");
  }
}
```


----------



## darkeye2 (19. Jan 2012)

also, erstens wäre es vom vorteil wenn du verraten würdest, was genau du machen willst, und das passierte, und was eben nicht funktioniert. falls es eine fehlermeldung gibt, diese bitte auch posten.

dann:

1.)
dass

```
public static void waiting (int n)
  {
 
        long t0, t1;
 
        t0 =  System.currentTimeMillis();
 
        do{
            t1 = System.currentTimeMillis();
        }
        while ((t1 - t0) < (n)*1000);
   }
```

solltest du unbedingt durch folgendes ersetzen, da deine methode sehr ineffectiev und cpu lastig ist!!

```
public static void waiting (int n){
			try {
				Thread.sleep(n);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
	    }
```

2.)
du solltest alles auf einem JPanel zeichnen, und nicht auf das frame selbst! also nicht die paint methode des frames ersetzen, sondern ein jpanel erstellen, und da die paintComponent methode überschrieben, wie das geht, siehst du in meinen vorherigen post.

3.)
du lädst im moment in jedem game loop die bielder neu, das ist völlig sinnlos und schlecht für die performance, die bilder sollten einbalig ganz am anfang beim initialisieren geladen werden

[TIPP]außerdem bitte auch deine klasse queueNEU posten[/TIPP]


----------



## Kampfzwereg (19. Jan 2012)

ich hab Kunden und einkaufskasse in flughafen und flugzeuge geändert.

1) ich benutzt die wait-methode nicht mehr. ich hab nen zähler im der klasse Flugzeug, die ich runterzählen lassen kann.

2) macht das denn so einen großen unterschied?

3)wie kann ich  das denn nur einmmal zeichen. ich muss das doch in die run methode schreiben oder? 



```
public class QueueNEU {
  // Anfang Attribute
  public Node first; //der forderste Knoten
  public Node last;  //der hinterste Knoten
  public int anzahlFlugzeuge=0;
  // Ende Attribute

  public QueueNEU() {
  }
  // Anfang Methoden
  public boolean isEmpty()
  {
    if(first == null)
    {
       return true;
    }
    else
    {
       return false;
    }

  }
  public void dequeue()
  {
     if(isEmpty())
     {
     }
     else if(first==last)
     {
       first= null;
       last= null;
       anzahlFlugzeuge--;
     }
     else
     {
        first= first.getNext();
        anzahlFlugzeuge--;
     }
  }
  public void enqueue(Object pObject)
  {
     if(isEmpty())
     {
       first = new Node(pObject, null);
       last= first;
       anzahlFlugzeuge++;
     }
     else if(first==last)
     {
       last= new Node(pObject, null);
       first.setNext(last);
       anzahlFlugzeuge++;
     }
     else
     {
       last.setNext(new Node(pObject, null));
       last = last.getNext();
       anzahlFlugzeuge++;
       
     }
  }
  public Object front()
  {
    if(isEmpty())
    {
      return null;
    }
    else
    {
      return first.getObject();    }

  }
```


Da hab ich auch ein Problem.

```
g.drawImage(imgFlugzeug,((Flugzeug)schlange.front().getPos()),155,this);
g.drawImage(imgFlugzeug,((Flugzeug)schlange.front().getNext().getPos()),155,this);
```
 Er sagt mir nämlich immer :

```
Flughafen.java:127:59: error: cannot find symbol
g.drawImage(imgFlugzeug((Flugzeug)schlange.front().getPos()),155,this);                                                                                                                     ^
```


----------



## darkeye2 (19. Jan 2012)

1.) die methode ist oben aber immer noch drin, und das solltest du ändern, und runterzählen ist auch nicht viel performanter, nimm doch einfach thread.sleep, wieso versuchst du da das rad neu zu erfinden?

2.) ja,  jpanel doublebuffered und es gibt noch weitere gründe, wieso es mehr sinn macht auf ein panel zu zeichnen und nicht auf das frame selbst, kannst dich in das thema mal einlesen, wenn es dich interessiert, spätestens, wenn du  viele dinge zeichnen musst und du auch noch ein menue usw. hast macht es sinn die zeichnung auf ein panel zu machen, also lieber gleich machen.

3.) du erstellst eine methode, die du init() nennst diese rufst  du in deinem constructor VOR dem starten des threads auf.
die methode könnte für den anfang so aussehen:

```
private void init(){
       try
       {
       imgFlugzeug = ImageIO.read(new File("img/flugzeugneu2.png"));
       imgHintergrund = ImageIO.read(new File("img/hintergrund.jpg"));
       }
       catch(IOException e)
       {
}
```

damit hast du die bilder geladen und musst die nicht mehr neuladen, zeichen musst du die schon noch, aber nicht nochmal laden, ich schaue mir deinen code mal an und poste in  10-15min  mal verbesserungsvorschläge und vllt ne lösung für dein problem.

EDIT: auch wenn du immer noch nicht alle deine klassen gepostet hast, verstehe ich das richtig: 
du hast  eine klasse flugzeug, die z.b. position oder so speichert und eine schlange, wo sich diese einreihen, und du bewegst die dann der reihe nach, oder was genau versuchst du zu machen? erklär das mal bitte, und reiche nach möglichkeit noch die restlichen klassen nach


----------



## Kampfzwereg (19. Jan 2012)

> die du init() nennst diese rufst du in deinem constructor VOR dem starten des threads auf



ich hab zwar nen Konstruktor aber kein thread. also trotzdem einfach rein?
fast....ich hab ne schlange ...die besteht aus Nodes. Und diese Nodes speichern Objekte vom Type flugzeug.
Zu der  Methode waiting. mein prob an der war, dass ja das ganze Prog warten muss.- ich will aber nur, dass das LFugzeug warten während nen anderes schon weiter flieg. geht das denn mit deiner methode?

```
/**
  *
  * Beschreibung
  *
  * @version 1.0 vom 22.11.2011
  * @author
  */

public class Node {

  // Anfang Attribute
  private Node next;
  private Object object;
  // Ende Attribute

  public Node(Object pObject, Node nextNode) {
    this.next = nextNode;
    this.object = pObject;
  }

  // Anfang Methoden
  public Node getNext() {
    return next;
  }

  public void setNext(Node next) {
    this.next = next;
  }

  public Object getObject() {
    return object;
  }

  public void setObject(Object object) {
    this.object = object;
  }

  // Ende Methoden
}
```

und die Nodes Speichern Objekte vom Typ Flugzeug.


----------



## darkeye2 (19. Jan 2012)

nein, das geht dann nicht, aber ich denke ich weiß, worauf das ganze hinausläuft, also dein erster fehler:
du speicherst in deinen nodes keine Flugzeuge, sondern Objecte, und das ist ja wieder was anderes (auch wenn dein flugzeug naütrlich ein object ist)

Ich glaube du gehst das ganze etwas falsch an, da es ja scheinbar ein spiel werden soll, so sollte der grundaufbau aussehen:

1.) klasse Sprite oder was ähnliches, die alles bewegbare  speichern kann, was halt im spiel vorkommt
die klasse soll nur einen konstructor haben, der den index des bilder mitkriegt, außerdem soll die klasse die abstracte methode move haben
2.) klasse Flugzeug erbt  von Sprite (public class Flugzeug extends Sprite) diese speichert start und zielposition des flugzeugs, sowie z.b. anzahl passagiere und max anzahl passagiere, methoden kannst die wählen, was du brauchst, musst aber move() entsprechend überschreiben.
3.) dein gamePanel erbt von jpanel und zeichnet alles drauf, enthält eine ArrayList<Sprite> um flugzeuge und sonstiges zu speichern. (implementiert runnable)
4.) dein jframe, dass das panel hinzufügt und es als thread speichert.

wie das ganze aussehen könnte werde ich dir gleich posten, als kleines funktionierendes beispiel, kannst es ja dann weiter ausbauen, oder wenn es dir nicht geflällt zumindest anschauen, wie sowas aufgebaut werden könnte


----------



## Kampfzwereg (19. Jan 2012)

ok.danke aber. es soll kein spiel werden. man soll nur auf knopfdruck flugzeuge hinzufügen, die dann landen, soundso lange warten und weiter fleigen. und die reiheh  sich dann ein und warten bis sie abgearbeitet werden. 
Ich werd mir auf jedenfall den Quellcode von dir angucken. doch das was du sagst hört sich so an, als obn ich jetzt quasi nochmal alles neu machen kann.... -.-


----------



## darkeye2 (19. Jan 2012)

so, es ist auf die schnelle gemacht und nicht ganz so optimal, aber es sollte passen, das prog hat jetzt 3 klassen
1: Flugzeug speichert alle wichtigen daten (position, warten? ziel position)
2: Flughafen jpanel, dass die flugzeuge zeichnet, können beliebig viele sein
3: FlughafenTest hat die main methode und tut nix, außer ein jframe zu erzeugen, in dem das panel angezeugt wird, und erzeugt die flugzeuge.

Du kannst selbst festlegen, was passierte, wenn ein flugzeug sein  ziel erreicht, im moment  passiert dann nix, du kannst auch wie ich schon hinkommentiert habe ein neus ziel angeben, und die zeit, wie lange es warten soll, bis es hinfliegt. kannst das ganze beliebig erweitern, die namen der bilder musst evl. anpassen, hab die grad "vereinfacht" so funktioniert das ganze schon mal, falls noch fragen bestehten, einfach schreiben.

(die flugzeuge können von jedem punkt zu jedem anderen fliegen, hab das zwar nicht optimal gelöst, aber sollte so auch passen)

Flugzeug.java

```
import java.awt.Point;

public class Flugzeug {
	
	private int  pasagiere = 0;
	private int pMax = 0;
	private int  posX;
	private int posY;
	private int wait = 0;
	private boolean fertig = false;
	private Point ziel;
	
	public Flugzeug(int startX, int startY, int zielX, int zielY, int  maxPassagiere){
		pMax = maxPassagiere;
		ziel = new Point(zielX, zielY);
		this.posX = startX;
		this.posY = startY;
	}
	
	public void move(){
		if(wait>0){
			wait-=45; //45 zeit zwischen deinen durchgängen
                                                // falls du diese änderst, musst auch hier anpassen
			return;
		}
		int tmpDifX = Math.abs(ziel.x-posX);
		int tmpDifY = Math.abs(ziel.y-posY);
		
		if(!fertig){
			if(tmpDifX>tmpDifY){  //strecke in X richtung länger als in Y
				if(ziel.x>posX){
					posX++;
					double x = posX;
					double m = ((((double)(ziel.y - (posY)))/((double) (ziel.x - (posX-1)))));
					double t = (-m*(posX-1))+(posY);
					posY = (int)((m*x)+t);
				}else{
					posX--;
					double x = posX;
					double m = ((((double)(ziel.y - (posY)))/((double) (ziel.x - (posX+1)))));
					double t = (-m*(posX+1))+(posY);
					posY = (int)((m*x)+t);
				}
			}else{
				if(ziel.y>posY){
					posY++;
					double y = posY;
					double m = ((((double)(ziel.y - (posY-1)))/((double) (ziel.x - (posX)))));
					double t = (-m*posX)+(posY-1);
					posX = (int)((y-t)/m);
				}else{
					posY--;
					double y = posY;
					double m = ((((double)(ziel.y - (posY+1)))/((double) (ziel.x - (posX)))));
					double t = (-m*posX)+(posY+1);
					posX = (int)((y-t)/m);
				}
			}
		}
	}
	
	//neues ziel setzen
	public void setZiel(int x, int y){
		ziel = new Point(x,y);
		fertig = false;
	}
	
	//gibt zurück, wie viele nicht mehr ins flugzeug gepasst haben
	public int einsteigen(int anzahl){
		if((pMax - pasagiere)>= anzahl){
			pasagiere += anzahl;
			return 0;
		}else{
			pasagiere = pMax;
			return anzahl - (pMax-pasagiere);
		}
	}
	
	public void aussteigen(int anzahl){
		pasagiere-=anzahl;
	}
	
	public int getPassagiere(){
		return pasagiere;
	}
	
	//gibt zurück, ob das flugzeug das ziel erreicht hat
	public boolean zielErreicht(){
		fertig = ((ziel.x == posX) && (ziel.y == posY));
		return fertig;
	}
	
	//aktuelle position zurückgeben
	public Point getPos(){
		return new Point(posX, posY);
	}
	
	
	//wartet die angegebene anzahl an ms
	public void waitMS(int time){
		wait =  time;
	}

}
```

Flughafen.java

```
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;

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

public class Flughafen extends JPanel implements Runnable{
	private static final long serialVersionUID = 1L;
	
	ArrayList<Flugzeug> arr = new ArrayList<Flugzeug>();
	BufferedImage flugzeug, hintergrund;
	
	public Flughafen(int sizeX, int sizeY){
		super();
		this.setPreferredSize(new Dimension(sizeX, sizeY));
		this.setVisible(true);
		init(); //frafiken laden
	}
	
	public void paintComponent(Graphics g){
		super.paintComponent(g);
		g.drawImage(hintergrund, 0, 0, this);
		for(int i = 0; i<arr.size(); i++){
			g.drawImage(flugzeug, arr.get(i).getPos().x, arr.get(i).getPos().y, this);
		}

	}
	
	public void addFlugzeug(Flugzeug f){
		arr.add(f);
	}
	
	private void init(){
		try{
			flugzeug = ImageIO.read(new File("img/flugzeug.png"));
		    hintergrund = ImageIO.read(new File("img/hintergrund.jpg"));
		}catch(IOException e){
			e.printStackTrace();
		}
	}

	public void run() {
		for(;;){
			for(Flugzeug f:arr){
				if(f.zielErreicht()){
					//f.setZiel(x, y) neues ziel setzen
					//f.waitMS(x) warten, befor zum nächsten ziel fliegen
				}else{
					f.move();
				}
			}
			try {
				Thread.sleep(45);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			this.validate();
			this.repaint();
		}
	}

}
```

FlughafenTest.java

```
import java.awt.Dimension;
import java.awt.FlowLayout;

import javax.swing.JFrame;

public class FlughafenTest extends JFrame{
	private static final long serialVersionUID = 1L;
	
	
	private Flughafen hafen = new Flughafen(300, 300);
	
	public FlughafenTest(){
		this.getContentPane().setLayout(new FlowLayout());
		this.getContentPane().add(hafen);
		this.setSize(new Dimension(310,310));
		hafen.addFlugzeug(new Flugzeug(300,200,100,20,0));
		
		this.setVisible(true);
		new Thread(hafen).start();
	}
	
	
	

	public static void main(String[] args) {
		new FlughafenTest();

	}

}
```


----------



## Kampfzwereg (20. Jan 2012)

aaaaalso:
danke erstmal. sieht sinnvoll aus. ich gucks mir nochmal genauer an, wenn ich wieder komme( bin das WE weg).

aaaber: ne Schlange würd ich generell mit Nodes machen, die dann die Objekte speichern. Ist der standatisierte Weg.


----------



## Kapfzwereg2 (21. Jan 2012)

Hi.hier is Kampzwereg. Ich musste mir, da ich mein PW vergessen hab eins zuschicken , was ich jetzt nciht auswendig weiß. also bin ich mal in zivil .
also die Sache ist die. Ich hab halt vorgaben von meinem Lehrer, wie ich die machen soll...undzwar mit ner schlange, die Nodes hat. 
Ich hab mir hier jetzt nochmal was zusammengebastelt. Ich hab das nur mit nem jFrame gemacht un ner paint() methode. Außerdem halt auch mit Nodes. Nimms mir nicht übel. Ich glaub dir, dass deine variante schneller ist. Aber ich würds gern (erstmal) so machen, wie ich das glaube. Ich denke das versteht man. 
Fänds trotzdem cool wenn jemand nochmal rüber guckst. Hab zwar keine Fehler mehr beim Compilen, aber wenn ichs ausführe kommt nen NullPointException.Hab geguckt müsste eigentlich laufen. Hab auch einfach mal genau sovile esachen gezeichnet, wie erstelt werden, dann dürfte die exceptioon eigentlich ncith kommen.

 Ich weiß jetzt, dass meine variante nicht rentabel ist, würde jemand trotzdem nochmal rübergücken und mir nur sagen, was speziell an meinen Prog nicht geht?

@Darkeye2 ich hoffe du bist nicht sauer 

Lg Kampfzwereg


----------



## Kampfzwereg3 (21. Jan 2012)

hier der Quellcode

```
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.awt.image.*;
import javax.imageio.*;
import java.io.*;

/**
  *
  * Beschreibung
  *
  * @version 1.0 vom 15.01.2012
  * @author
  */

public class Flughafen extends JFrame implements Runnable {
  // Anfang Attribute



  private Thread t = new Thread(this);
  private BufferedImage imgHintergrund = null;
  private BufferedImage imgFlugzeug = null;
  private boolean besetzt= false;
  private QueueNEU schlange = new QueueNEU();
  private int FlugzeugeZuErstellen=2;
  private JButton jBneuesFlugzeug = new JButton();
  // Ende Attribute

  public Flughafen(String title) {
    // Frame-Initialisierung
    super(title);
    t.start();
    setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    int frameWidth = 480;
    int frameHeight = 320;
    setSize(frameWidth, frameHeight);
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (d.width - getSize().width) / 2;
    int y = (d.height - getSize().height) / 2;
    setLocation(x, y);
    Container cp = getContentPane();
    cp.setLayout(null);

    // Anfang Komponenten

    jBneuesFlugzeug.setBounds(0, 232, 281, 33);
    jBneuesFlugzeug.setText("neues Flugzeug");
    jBneuesFlugzeug.setMargin(new Insets(2, 2, 2, 2));
    jBneuesFlugzeug.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        jBneuesFlugzeug_ActionPerformed(evt);
      }
    });
    cp.add(jBneuesFlugzeug);
    // Ende Komponenten

    setResizable(false);
    setVisible(true);
  }

  // Anfang Methoden
  public  void run()                                                              //eine Methode die durchgehen läuft.
  {
    while(true)
    {
       try
       {
       imgFlugzeug = ImageIO.read(new File("img/flugzeugneu2.png"));               //als erstes wird der Hintergrund erstellt
       imgHintergrund = ImageIO.read(new File("img/hintergrund.jpg"));             //und das Flugzeug
       }
       catch(IOException e)
       {

       }
       repaint();                                                                  //dann werden diese gezeichnet
//       if(FlugzeugeZuErstellen>0)                                                  //Mittels eines Buttons kann man Flugzeuge erstellen
//       {
          schlange.enqueue(new Flugzeug(1+(int)(Math.random()*1),0));
//          schlange.enqueue(new Flugzeug(1+(int)(Math.random()*1),0));
//          FlugzeugeZuErstellen--;
//       }
        repaint();

       if(((Flugzeug)schlange.front()).getPos()<480)                                //Ist das Flugezug aus dem Bild geflogen?
       {
          if(!besetzt)                                                              //Wenn die Landebahn nicht besetzt ist
          {
            if(((Flugzeug)schlange.front()).getPos()<400)                           //und das Flugzeug noch nich den Landepunkt passiert hat
            {
               ((Flugzeug)schlange.front()).setPos(((Flugzeug)schlange.front()).getPos()+1);//soll er sich bewegen
            }
            else if(((Flugzeug)schlange.front()).getPos()==400)                     //wenn er auf dem Landepunkt ist, soll (vorerst) nur der der Punkt als besetzt angezeigt werden
            {
              besetzt = true;
            }
          }
          else
          {
            if(((Flugzeug)schlange.front()).getPos()<400)                            //wenn der Landepunkt besetzt ist,soll er bis zu diesem Fliegen und nichts tun
            {
              ((Flugzeug)schlange.front()).setPos(((Flugzeug)schlange.front()).getPos()+1);
            }
          }
       }
       else
       {                                                                            //wenn das Flugzeug nicht mehr im Bild ist, wir es wieder auf Position 0 gesetzt.
         ((Flugzeug)schlange.front()).setPos(0);                                    // später wird es aus der Schlange entfernt und die Landebahn wieder freigegeben.
         besetzt= false;
       }

       repaint();
       this.waiting(50);
       
    }
  }


  public void paint(Graphics g)                                                     //Die Methode die (vorerst bis zu 2 Flugzeuge Zeichnet.
  {
     super.paint(g);
     {
       g.drawImage(imgHintergrund,0,0,this);
       g.drawImage(imgFlugzeug,((Flugzeug)schlange.getFirst().getNext().getObject()).getPos(),155,this);
       //g.drawImage(imgFlugzeug,((Flugzeug)schlange.getFirst().getNext().getObject()).getPos(),155,this);
     }

  }
  

  
  
  
  public static void waiting (int n)                                                 //Eine Methode, die n Millisekunden wartet.
  {

        long t0, t1;

        t0 =  System.currentTimeMillis();

        do{
            t1 = System.currentTimeMillis();
        }
        while ((t1 - t0) < (n)*1000);
   }

  









  public void jBneuesFlugzeug_ActionPerformed(ActionEvent evt) {
    // TODO hier Quelltext einfügen
  }

  // Ende Methoden

  public static void main(String[] args)
  {
    new Flughafen("Flughafen");

  }
}
```


----------



## darkeye2 (22. Jan 2012)

also ich werde mir deinen code heute abend mal genauer anschauen, aber probier doch mal den thread erst am ende des constructors zu starten, also als letztes (nach setVisible(true));


----------



## Kampfzwereg (22. Jan 2012)

wie gesagt...ich hätte gernen eine Lösung im Bezug auf meinen Quelltext....
Hier die Fehlermeldung: 


```
Starte L:\Schule\Informatik\Projekte JavaE\Flughafen\Flughafen.java

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at Flughafen.paint(Flughafen.java:125)
	at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:781)
	at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:728)
	at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:677)
	at javax.swing.RepaintManager.access$700(RepaintManager.java:59)
	at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1621)
	at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:705)
	at java.awt.EventQueue.access$000(EventQueue.java:101)
	at java.awt.EventQueue$3.run(EventQueue.java:666)
	at java.awt.EventQueue$3.run(EventQueue.java:664)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:675)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at Flughafen.paint(Flughafen.java:125)
	at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:781)
	at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:728)
	at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:677)
	at javax.swing.RepaintManager.access$700(RepaintManager.java:59)
	at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1621)
	at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:705)
	at java.awt.EventQueue.access$000(EventQueue.java:101)
	at java.awt.EventQueue$3.run(EventQueue.java:666)
	at java.awt.EventQueue$3.run(EventQueue.java:664)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:675)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
```


----------



## pro2 (22. Jan 2012)

Die Fehlermeldung ist eindeutig..
[JAVA=125]g.drawImage(imgFlugzeug,((Flugzeug)schlange.getFirst().getNext().getObject()).getPos(),155,this);[/code]
Da ist ein Objekt null. Entweder bleibt 
	
	
	
	





```
imgFlugzeug
```
 null, dein schlangen Object oder this (was unwahrscheinlich ist). Einfach mal n bisschen rumspielen..


----------



## darkeye2 (22. Jan 2012)

also deine fehlermeldung weißt ja auf diese zeile hin:

```
g.drawImage(imgFlugzeug,((Flugzeug)schlange.getFirst().getNext().getObject()).getPos(),155,this);
```
da rufst du ja drawImage auf, mit parametern bild -> imgFlugzeug, xPos -> deine methode, yPos -> 155, Observer -> dein JFrame.
Da dein JFrame als Observer keine probleme macht und auch 155  ein gültiger y-wert ist, bleiben nur noch imgFlugzeug und deine konstruktion da übrig, die den fehler verursachen können.

du lädst deine bilder immer noch bei jedem schleifendurchgang, was eine fehlerquelle ist, und UNBEDINGT zu vermeiden ist, weil:
stell dir vor, dein thread braucht etwas zeit zum starten, also die this.setVisible(true) kommt zuerst dran, und deine methode paint will jetzt das JFrame zeichnen, und da du die paint methode überschrieben hast, wird da auch das flugzeug und der hintergrund gezeichnet, ABER dein thread der das bei jedem durchgang lädt ist noch gar nicht soweit, dann sind die bilder beide null, also nicht vorhanden, variable ist nicht initialisiert.
Mach den rest so wie du es für richtig hälst, aber das ist  ein sehr grober fehler!

um zu sehen, ob es daran liegt, kannst du abfragen, ob deine bilder schon da sind:
if(imgFlugzeug == null)
   System.out.println("Bild nicht da!!");

ich vermute aber, dass es hier nicht am bild liegt, auch wenn es durchaus möglich wäre.

Ich denke, deine konstruktion funktioniert nicht ganz, bist du sicher, dass der erste Node eine verweis auf den zweiten hat (getNext())? dann castest du den ja zu einem object und dann zu einem flugzeug, hast du geprüft, ob das funktioniert hat? und zu guter letzt, was gibt die methode getPos zurück, ist es ein gültiger integer?
Um das alles zu prüfen füge bitte folgenden code VOR die betroffene zeile hinzu, und poste dann die ausgaben.

```
if(imgFlugzeug == null)
   System.out.println("Bild [Flugzeug] nicht da!!");
System.out.println("ist getFirst null?: "+ (schlange.getFirst() == null));
System.out.println("ist getNext null?: "+ (schlange.getFirst().getNext() == null);
System.out.println("Ist das object ein Flugzeug?: "+(((Flugzeug)schlange.getFirst().getNext().getObject()) instanceof Flugzeug));
System.out.println("x position: "+((Flugzeug)schlange.getFirst().getNext().getObject()).getPos());
```


----------



## Kampfzwereg (23. Jan 2012)

also .... ich habs zum laufen gebracht. Passt auch alles. 
Habe , wie befohlen   , den Hintergrund nur einmal am anfang initialisiert.
Einen kleinen Schönheitsfehler hab ich aber noch. Er soll mir halt mejhrewre Flugzeuge zeichnen. Macht er auch. Doch nur mein erstes wird durchgehend angezeigt. Die anderen blitzen alle 5 Sekunden mal ne Millisekunde lang auf. Aber so stark ruckeln tut das Bild an sich nicht. Sieht nicht so aus, als sei das nicht-Zeichnen eine Folge eines uneffektiven Quellcodes.Gibts da spontan noch ne andere Möglichkeit. 

Hier mal der Quellcode der Beiden klassen, an denen ich rumgedoktort haben, Flughafen und Flugzeug:


```
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.awt.image.*;
import javax.imageio.*;
import java.io.*;

/**
  *
  * Beschreibung
  *
  * @version 1.0 vom 15.01.2012
  * @author
  */

public class Flughafen extends JFrame implements Runnable {
  // Anfang Attribute



  private Thread t = new Thread(this);
  private BufferedImage imgHintergrund = null;
  private BufferedImage imgFlugzeug = null;
  private boolean besetzt;
  private QueueNEU schlange = new QueueNEU();
  private int FlugzeugeZuErstellen=3;
  private int zeitZaehler=300;

  // Ende Attribute

  public Flughafen(String title) {
    // Frame-Initialisierung
    super(title);
    t.start();
    setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    int frameWidth = 480;
    int frameHeight = 320;
    try
    {

       imgHintergrund = ImageIO.read(new File("img/hintergrund.jpg"));
    }
    catch(IOException e)
    {
    }
    setSize(frameWidth, frameHeight);
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (d.width - getSize().width) / 2;
    int y = (d.height - getSize().height) / 2;
    setLocation(x, y);
    Container cp = getContentPane();
    cp.setLayout(null);

    // Anfang Komponenten

    // Ende Komponenten

    setResizable(false);
    setVisible(true);
  }

  // Anfang Methoden
  public  void run()
  {
      while(true)
      {
       try
       {
       imgFlugzeug = ImageIO.read(new File("img/flugzeugneu2.png"));
       }
       catch(IOException e)
       {

       }
         if(FlugzeugeZuErstellen>0)
         {
           if(zeitZaehler==100 || zeitZaehler==280 || zeitZaehler==300)
           {
              schlange.enqueue(new Flugzeug(1+(int)(Math.random()*5),0));
              FlugzeugeZuErstellen--;
              zeitZaehler--;
           }
           else
           {
             zeitZaehler--;
           }
           if(zeitZaehler==0)
           {
             zeitZaehler= 300;
           }

         }
       if(!schlange.isEmpty())
       {
          repaint();
       }
       if(((Flugzeug)schlange.front()).hintermBild())
       {
         schlange.dequeue();
         FlugzeugeZuErstellen++;
         besetzt= false;
       }
       else
       {
          if(schlange.anzahlFlugzeuge==1)
          {
            ((Flugzeug)schlange.front()).checkPos(besetzt);
             besetzt = ((Flugzeug)schlange.front()).getIstBesetzt();
          }
          else if(schlange.anzahlFlugzeuge==2)
          {
            ((Flugzeug)schlange.front()).checkPos(besetzt);
             besetzt = ((Flugzeug)schlange.front()).getIstBesetzt();
            ((Flugzeug)schlange.getFirst().getNext().getObject()).checkPos(besetzt);
             besetzt = ((Flugzeug)schlange.getFirst().getNext().getObject()).getIstBesetzt();
          }
          else if(schlange.anzahlFlugzeuge==3)
          {
             ((Flugzeug)schlange.front()).checkPos(besetzt);
             besetzt = ((Flugzeug)schlange.front()).getIstBesetzt();
            ((Flugzeug)schlange.getFirst().getNext().getObject()).checkPos(besetzt);
             besetzt = ((Flugzeug)schlange.getFirst().getNext().getObject()).getIstBesetzt();
             ((Flugzeug)schlange.getFirst().getNext().getNext().getObject()).checkPos(besetzt);
             besetzt = ((Flugzeug)schlange.getFirst().getNext().getNext().getObject()).getIstBesetzt();
          }
       }
       this.waiting(40);
       
    }
  }
  public void paint(Graphics g)
  {
     super.paint(g);
     {
       g.drawImage(imgHintergrund,0,0,this);
       g.drawImage(imgFlugzeug,((Flugzeug)schlange.front()).getPos(),148,this);
       if(schlange.anzahlFlugzeuge==2)
       {
         g.drawImage(imgFlugzeug,((Flugzeug)schlange.getFirst().getNext().getObject()).getPos(),148,this);
       }
       else if(schlange.anzahlFlugzeuge>2)
       {
         g.drawImage(imgFlugzeug,((Flugzeug)schlange.getFirst().getNext().getObject()).getPos(),148,this);
         g.drawImage(imgFlugzeug,((Flugzeug)schlange.getFirst().getNext().getNext().getObject()).getPos(),148,this);
       }
     }

  }

   public static void waiting (int n)
   {
            try {
                Thread.sleep(n);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
   }
  public boolean getBesetzt() {
    return besetzt;
  }

  // Ende Methoden

  public static void main(String[] args)
  {
    new Flughafen("Flughafen");

  }
}
```


```
/**
  *
  * Beschreibung
  *
  * @version 1.0 vom 13.01.2012
  * @author
  */

public class Flugzeug
{

  // Anfang Attribute
  private int anzahlPassagiere;
  private int pos=0;
  private int zeitZaehler=0;
  private boolean istBesetzt;
  // Ende Attribute

  public Flugzeug(int x, int pPos)
  {
    this.anzahlPassagiere = x;
    this.pos=pPos;
  }

  // Anfang Methoden
  public int getAnzahlPassagiere() {
    return anzahlPassagiere;
  }

  public void setAnzahlPassagiere(int anzahlPassagiere) {
    this.anzahlPassagiere = anzahlPassagiere;
  }

  public int getPos() {
    return pos;
  }

  public void setPos(int pos) {
    this.pos = pos;
  }
  
  public void checkPos(boolean pIstBesetzt)
  {


      if(!pIstBesetzt)
      {
        if(this.getPos()<420)
        {
           this.setPos(this.getPos()+1);
        }
        else if(this.getPos()==420)
        {

          if(zeitZaehler==0)
          {
            zeitZaehler= (100*this.getAnzahlPassagiere());
            istBesetzt = true;
          }
        }
      }
      else
      {
        if(this.getPos()<420)
        {
          this.setPos(this.getPos()+1);
        }
        else
        {
          if(zeitZaehler>0)
          {
             zeitZaehler--;
          }
          else
          {
            this.setPos(this.getPos()+1);
            istBesetzt=false;
          }

        }

      }


  }
  public boolean hintermBild()
  {


       if(this.getPos()>480)
       {
         return true;
       }
       else
       {
         return false;
       }

  }

  public boolean getIstBesetzt() {
    return istBesetzt;
  }

  public void setIstBesetzt(boolean istBesetzt) {
    this.istBesetzt = istBesetzt;
  }

  // Ende Methoden
}
```


----------



## darkeye2 (23. Jan 2012)

[hi, also befor ich dir lösungen vorschlage, ich kann dir genau sagen, woran das aufflackern liegt, wenn es bei dir flackert, wärend ein flugzeug wartet^^, deine methode waiting, die millisekunden zählt, bewirkt genau so wie thread.sleep, dass der ganze thread wärend dessen beschäftigt ist und somit nix machen kann, wie ich im oberen (vollständigen) beispiel gezeigt habe, muss man das warten der flugzeuge anders realisieren, ansonsten schaue ich mir gleich mal deinen code an, um zu sehen, ob das noch andere ursachen hat.]

ok, bin mir nicht sicher, aber das scheinst du schon geändert zu haben, werde es mal kurz bei mir ausprobieren, um zu sehen, was genau passiert


und bitte, lad auch das bild fürs flugzeug gleich von anfang an und nicht bei jedem durchlauf!!!*
und das t.start gehört auch ans ende des constructors, wenn alles fertig initialisiert ist.


*:  dein construct hier:

```
while(true)
      {
       try
       {
       imgFlugzeug = ImageIO.read(new File("img/flugzeugneu2.png"));
       }
       catch(IOException e)
       {
 
       }
...
```

wäre, wenn du es mal auf ein reelles beispiel überträgst, sowas hier:
stell dir vor, du schreibst ein wort, buchstabe für buchstabe (jeder buchstabe steht für einen schleifendurchgang), und nun nimmst du vor jedem buchstaben eine neue Tastatur her (das ständige laden des bildes), wäre es da nicht schlauer, bereits vor dem schreiben (im constructor) eine vollständige tastatur und alles andere was du brauchst zu nehmen, um dann solche zeitaufwendigen sachen nicht ständig nochmal zu machen?


EDIT: könntest du mal bitte deine aktuelle klasse Node und QueueNEU posten?
also bei mir flackert dein teil generell, was aber auch am jframe liegen könnte, das ist ja nicht doublebuffered, aber bin grad noch auf der suche nach deinem fehler


ALSO, hab kleine änderungen vorgenommen, an deiner Flughafen klasse, es flackert zwar immer noch, aber es wird alles angezeigt, wenn es bei dir nicht so ist, schreib bitte dein os.
(das flackern ist beim jframe normal)

```
import java.awt.*;
import javax.swing.*;
import java.awt.image.*;
import javax.imageio.*;
import java.io.*;
 
/**
  *
  * Beschreibung
  *
  * @version 1.0 vom 15.01.2012
  * @author
  */
 
public class Flughafen extends JFrame implements Runnable {
  // Anfang Attribute
 
 
 
  private Thread t = new Thread(this);
  private BufferedImage imgHintergrund = null;
  private BufferedImage imgFlugzeug = null;
  private boolean besetzt;
  private QueueNEU schlange = new QueueNEU();
  private int FlugzeugeZuErstellen=3;
  private int zeitZaehler=300;
 
  // Ende Attribute
 
  public Flughafen(String title) {
    // Frame-Initialisierung
    super(title);
    this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    int frameWidth = 480;
    int frameHeight = 320;
    try
    {
       imgFlugzeug = ImageIO.read(new File("img/flugzeugneu2.png"));
       imgHintergrund = ImageIO.read(new File("img/hintergrund.jpg"));
    }
    catch(IOException e)
    {
    }
    this.setSize(frameWidth, frameHeight);
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (d.width - getSize().width) / 2;
    int y = (d.height - getSize().height) / 2;
    this.setLocation(x, y);
    Container cp = getContentPane();
    cp.setLayout(null);
 
    // Anfang Komponenten
 
    // Ende Komponenten
 
    setResizable(false);
    setVisible(true);
    t.start();
  }
 
  // Anfang Methoden
  public  void run()
  {
      while(true)
      {
         if(FlugzeugeZuErstellen>0)
         {
           if(zeitZaehler==100 || zeitZaehler==280 || zeitZaehler==300)
           {
              schlange.enqueue(new Flugzeug(1+(int)(Math.random()*5),0));
              FlugzeugeZuErstellen--;
           }
           zeitZaehler--;
           if(zeitZaehler==0)
           {
             zeitZaehler= 300;
           }
 
         }
       if(!schlange.isEmpty())
       {
    	  validate();
          repaint();
       }
       if(((Flugzeug)schlange.front()).hintermBild())
       {
         schlange.dequeue();
         FlugzeugeZuErstellen++;
         besetzt= false;
       }
       else
       {
          if(schlange.anzahlFlugzeuge==1)
          {
            ((Flugzeug)schlange.front()).checkPos(besetzt);
             besetzt = ((Flugzeug)schlange.front()).getIstBesetzt();
          }
          else if(schlange.anzahlFlugzeuge==2)
          {
            ((Flugzeug)schlange.front()).checkPos(besetzt);
             besetzt = ((Flugzeug)schlange.front()).getIstBesetzt();
            ((Flugzeug)schlange.getFirst().getNext().getObject()).checkPos(besetzt);
             besetzt = ((Flugzeug)schlange.getFirst().getNext().getObject()).getIstBesetzt();
          }
          else if(schlange.anzahlFlugzeuge==3)
          {
             ((Flugzeug)schlange.front()).checkPos(besetzt);
             besetzt = ((Flugzeug)schlange.front()).getIstBesetzt();
            ((Flugzeug)schlange.getFirst().getNext().getObject()).checkPos(besetzt);
             besetzt = ((Flugzeug)schlange.getFirst().getNext().getObject()).getIstBesetzt();
             ((Flugzeug)schlange.getFirst().getNext().getNext().getObject()).checkPos(besetzt);
             besetzt = ((Flugzeug)schlange.getFirst().getNext().getNext().getObject()).getIstBesetzt();
          }
       }
       waiting((int)Math.round(1000.0/60.0));
       
    }
  }
  public void paint(Graphics g)
  {
     super.paint(g);
       g.drawImage(imgHintergrund,0,0,this);
       g.drawImage(imgFlugzeug,((Flugzeug)schlange.front()).getPos(),148,this);
       if(schlange.anzahlFlugzeuge==2)
       {
         g.drawImage(imgFlugzeug,((Flugzeug)schlange.getFirst().getNext().getObject()).getPos(),148,this);
       }
       else if(schlange.anzahlFlugzeuge>2)
       {
         g.drawImage(imgFlugzeug,((Flugzeug)schlange.getFirst().getNext().getObject()).getPos(),148,this);
         g.drawImage(imgFlugzeug,((Flugzeug)schlange.getFirst().getNext().getNext().getObject()).getPos(),148,this);
       }
     
 
  }
 
   public static void waiting (int n)
   {
            try {
                Thread.sleep(n);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
   }
  public boolean getBesetzt() {
    return besetzt;
  }
 
  // Ende Methoden
 
  public static void main(String[] args)
  {
    new Flughafen("Flughafen");
 
  }
}
```


----------



## Kampfzwereg (23. Jan 2012)

hm.... also ich hatte das initialisieren des Flugszeugs auch am anfang gemacht. da wurd mir aber kein bild angezeigt. alles nur graus .nur alle 2 seklunden blitze mal gaaanz kurz etwas auf. ich seh dann zwar zwar alle Flugzeuge, aber nur ne millisekunde lang -.-
als ich das mit den flugzeug aber in der run Methode hatte und am afnang nur der Hintergrund initialisiert wurde gings noch a bissel.


```
/**
  *
  * Beschreibung
  *
  * @version 1.0 vom 22.11.2011
  * @author
  */

public class Node {

  // Anfang Attribute
  private Node next;
  private Object object;
  // Ende Attribute

  public Node(Object pObject, Node nextNode) {
    this.next = nextNode;
    this.object = pObject;
  }

  // Anfang Methoden
  public Node getNext() {
    return next;
  }

  public void setNext(Node next) {
    this.next = next;
  }

  public Object getObject() {
    return object;
  }

  public void setObject(Object object) {
    this.object = object;
  }

  // Ende Methoden
}
```


```
/**
  *
  * Beschreibung
  *
  * @version 1.0 vom 12.01.2012
  * @author
  */

public class QueueNEU {

  // Anfang Attribute
  public Node first; //der forderste Knoten
  public Node last;  //der hinterste Knoten
  public int anzahlFlugzeuge=0;
  // Ende Attribute

  public QueueNEU() {
  }

  // Anfang Methoden
  public boolean isEmpty()
  {
    if(first == null)
    {
       return true;
    }
    else
    {
       return false;
    }

  }

  public void dequeue()
  {
     if(isEmpty())
     {
     }
     else if(first==last)
     {
       first= null;
       last= null;
       anzahlFlugzeuge--;
     }
     else
     {
        first= first.getNext();
        anzahlFlugzeuge--;
     }
  }

  public void enqueue(Object pObject)
  {
     if(isEmpty())
     {
       first = new Node(pObject, null);
       last= first;
       anzahlFlugzeuge++;
     }
     else if(first==last)
     {
       last= new Node(pObject, null);
       first.setNext(last);
       anzahlFlugzeuge++;
     }
     else
     {
       last.setNext(new Node(pObject, null));
       last = last.getNext();
       anzahlFlugzeuge++;
       
     }
  }

  public Object front()
  {
    if(isEmpty())
    {
      return null;
    }
    else
    {
      return first.getObject();
    }

  }



  public int getAnzahlFlugzeuge() {
    return anzahlFlugzeuge;
  }

  public Node getFirst() {
    return first;
  }

  public Node getLast() {
    return last;
  }

  // Ende Methoden
}
```


----------



## darkeye2 (24. Jan 2012)

also dein code  (unverändert) funktioniert bei mir grad, es flackert ganz leicht, aber ansonsten geht alles, ist nicht optimal, aber es funktioniert, welches os hast du?


----------



## Kampfzwereg (25. Jan 2012)

ja...wär auch nur ne überganslösung ag ich mal....os?


----------



## darkeye2 (25. Jan 2012)

os = operating system, also auf deutsch Betriebssystem (BS), also windows (wenn ja, welche version, xp, vista, ...) oder linux (ubuntu, suse, ...) oder nen mac?
(gibt noch mehr, aber meistens nicht im privaten haushalt^^)


----------

