sich bewegende grafische Objekte

Kampfzwereg

Bekanntes Mitglied
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
 
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?
 
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 😀)
 
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...
 
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.
 
Java:
try {
  Thread.sleep(x);
} catch (InterupptedException ie) {
  // dont care...
}
 
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.

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

Dann noch die Methode paint() die (erst) eine einfach Linie zeichnet.
Java:
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.
Java:
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
 
Ich seh hier auch nur einen Kreis
Java:
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...)
 
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
 
Lass dir dann halt mal zähler (umlaute vermeiden!!) in der paint Methode ausgeben, ändert sich der Wert da?
 
hmmm....ich hab mit
Java:
 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)?
 
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:
Java:
Thread t = new Thread(this);
t.start();

Nachdem du das getan hast, wird run() auch wirklich ausgeführt...
 
Zuletzt bearbeitet:
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?!
 
Zuletzt bearbeitet:
Wenn deine Klasse Runnable implementiert:
Code:
new Thread(deinRunnable).start();
 
Java:
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
Java:
private Thread t = new Thread(this);

und den Befehl
Java:
t.start();
in den Konstruktior geschrieben
 
ja da hab ich wohl nich nachgedacht :-] sry...

aber trotzdem...auch wenn ich das korrigiere spuckt er mir das aus:
Java:
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? 🙂
 
Deine Klasse Flughafen muss dazu das Interface Runnable impmenetieren:
Java:
public class Flughafen extends ... implements Runnable {
    public void run() {...}
}
 
ist eigendlich ganz einfach:
(musst halt alles andere noch ergänzen, ist nur der grundrahmen fürs prog)
Java:
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^^)
 
Zuletzt bearbeitet:
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
Java:
this.setSize(new Dimension(600,450));
das weglasse.
 
Aber warum ist denn for(;; )sinnvoller ? was ist der genaue unterschied? Andere Laufzeit?
Wo haste denn das her?!
Code:
for(;;)
ist genau das gleiche wie
Code:
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...
 
Zuletzt bearbeitet:
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
 
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
Code:
bRunning = !bRunning
. Diese Variable wird dann in run geprüft, fertig...
 
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.
Java:
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");

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

Java:
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");
	 
	  }
	}
 
Zuletzt bearbeitet:
Übrigens: du solltest, wenn du schon Swing nutzt, nicht Paint, sondern paintComponent() überschreiben, damit Java die Möglichkeit, alle anderen Komponenten zu zeichnen...
 
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.
 
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!
 
@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!
 
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.
 
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
 
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
}
 
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
 
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 ....
 
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....
 
Zuletzt bearbeitet:
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)
Java:
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");
	 
	  }
	}
 
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.

Java:
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");
  }
}
 
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
Java:
 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!!
Java:
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]
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben