Applet Methode in Timer einbinden

D

danthe

Gast
Hallo,
Wir haben aktuell in der Schule (10.Klasse) den Auftrag, ein Ping Pong zu basteln. Mein Programm funktioniert soweit ganz gut, allerdings komme und komme ich bei der Erstellung und Verwendung eines Timers nicht weiter.
Das Problem ist folgendes:
Ich habe eine Methode ball(), die durch das Drücken des Start-Knopfes aufgerufen wird. In dieser Methode gibt es innerhalb einer immer erfüllten While-Schleife 4 einzelne Methoden für den Ball, der sich immer diagonal in 4 verschiedene Richtungen bewegt, die je nach festgelegter Richtung aufgerufen werden. Da dieser Ball nicht rumflitzen soll, möchte ich das natürlich timen. Im Moment, nur um die Funktion zu überprüfen, muss ich dazu Thread.sleep benutzen, was natürlich logischerweise alles bremst und ich so die Knöpfe zum Bewegen der Schläger niciht benutzen kann (außerdem muss ich das Programm mit dem Task-Manager beenden). Ich versuche jetzt also einen Timer zu machen, der in diesen Richtungsmethoden anfängt und nach dem Zeichnen des Balles aufhört, damit dieser Abschnitt 50 Millisekunden dauert. Wenn ich aber den Timer aus javax.swing.timer benutze, muss ich aus diesem void irgendwie ein Actionevent machen, das nicht durch einen Knopf, sondern durch die ball()-Methode aktiviert werden kann (quasi wie eine normale Methode auch). Könnt ihr mir weiterhelfen? Oder kennt ihr vielleicht sogar eine bessere Möglichkeit?
Code:
Java:
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import javax.swing.Timer;
public class pingpong extends Applet {
  private Button button1 = new Button();
  private Button button2 = new Button();
  private Button button3 = new Button();
  private Button button4 = new Button();
  Graphics stift;
  boolean anfang=false;
  int y1=134;
  int y2=134;
  int y1plus=y1+50;
  int y2plus=y2+50;
  int xkreis=200;
  int ykreis=176;
  int richtung=36;
  int punkt1=0;
  int punkt2=0;
  boolean stop=false;
  private Button button5 = new Button();
  private TextArea textArea1 = new TextArea("", 1, 1, TextArea.SCROLLBARS_NONE);
    public void init() {
    setLayout(null);
    stift=getGraphics();
    setBounds(0, 0, 500, 700);

    button1.setBounds(432, 384, 43, 73);
    button1.setLabel("UP");
    button1.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        button1_ActionPerformed(evt);
      }
    });
    add(button1);
    button2.setBounds(432, 464, 43, 73);
    button2.setLabel("DOWN");
    button2.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        button2_ActionPerformed(evt);
      }
    });
    add(button2);
    button3.setBounds(16, 384, 43, 65);
    button3.setLabel("UP");
    button3.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        button3_ActionPerformed(evt);
      }
    });
    add(button3);
    button4.setBounds(16, 464, 43, 81);
    button4.setLabel("DOWN");
    button4.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        button4_ActionPerformed(evt);
      }
    });
    add(button4);
    button5.setBounds(208, 456, 75, 25);
    button5.setLabel("Starten!");
    button5.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        button5_ActionPerformed(evt);
      }
    });
    add(button5);

    textArea1.setBounds(144, 528, 185, 89);
    textArea1.setText("");
    add(textArea1);
  }

  void rechtsunten(){
     // time.start();
     int y2spezial=y2-18;
      if(xkreis>=500){
        xkreis=200;
        ykreis=176;
        punkt1=punkt1+1;
        textArea1.setText("Player1: "+punkt1+"  Player2: "+punkt2+"");
        // time.stop();
        ball();
      }
      else if(xkreis>=457 && xkreis<=472 && ykreis>=y2spezial && ykreis<=y2plus){
        richtung=69;
      }
      else if(ykreis>=300){
        richtung=123;
      }
      else
      {
      richtung=36;   // entspricht 3-6 Uhr
      }
      stift.fillOval(xkreis,ykreis,12,12);
      try {
      Thread.sleep  ( 50 );
      } catch ( InterruptedException e ) {}    //soll durch Timer ersetzt werden, da bei sleep die Buttons nicht mehr gedrückt werden können
      // time.stop();
      stift.clearRect(xkreis,ykreis,12,12);
      xkreis=xkreis+3;
      ykreis=ykreis+3;
   }
   void linksunten(){
    // time.start();
     int y1spezial=y1-18;
      if(xkreis<=0){
        xkreis=200;
        ykreis=176;
        punkt2=punkt2+1;
        textArea1.setText("Player1: "+punkt1+"  Player2: "+punkt2+"");
      //  time.stop();
        ball();
      }
      else if(xkreis>=10 && xkreis<=28 && ykreis>=y1spezial && ykreis<=y1plus){
        richtung=36;
      }
      else if(ykreis>=300){
        richtung=912;
      }
      else
      {
      richtung=69;   // entspricht 6-9 Uhr
      }
      stift.fillOval(xkreis,ykreis,12,12);
      try {
      Thread.sleep  ( 50 );
      } catch ( InterruptedException e ) {}    //soll durch Timer ersetzt werden, da bei sleep die Buttons nicht mehr gedrückt werden können
      // time.stop();
      stift.clearRect(xkreis,ykreis,12,12);
      xkreis=xkreis-3;
      ykreis=ykreis+3;
   }
   void rechtsoben(){
    // time.start();
     int y2spezial=y2-18;
      if(xkreis>=500){
        xkreis=200;
        ykreis=176;
        punkt1=punkt1+1;
        textArea1.setText("Player1: "+punkt1+"  Player2: "+punkt2+"");
        // time.stop();
        ball();
      }
      else if(xkreis>=457 && xkreis<=472 && ykreis>=y2spezial && ykreis<=y2plus){
        richtung=912;
      }
      else if(ykreis<=0){
        richtung=36;
      }
      else
      {
      richtung=123;   // entspricht 12-3 Uhr
      }
      stift.fillOval(xkreis,ykreis,12,12);
      try {
      Thread.sleep  ( 50 );
      } catch ( InterruptedException e ) {}    //soll durch Timer ersetzt werden, da bei sleep die Buttons nicht mehr gedrückt werden können
      // time.stop();
      stift.clearRect(xkreis,ykreis,12,12);
      xkreis=xkreis+3;
      ykreis=ykreis-3;
   }
   void linksoben(){
     // time.start();
      int y1spezial=y1-18;
      if(xkreis<=0){
        xkreis=200;
        ykreis=176;
        punkt2=punkt2+1;
        textArea1.setText("Player1: "+punkt1+"  Player2: "+punkt2+"");
        // time.stop();
        ball();
      }
      else if(xkreis>=10 && xkreis<=25 && ykreis>=y1spezial && ykreis<=y1plus){
        richtung=123;
      }
      else if(ykreis<=0){
        richtung=69;
      }
      else
      {
      richtung=912;   // entspricht 9-12 Uhr
      }
      stift.fillOval(xkreis,ykreis,12,12);
      try {
      Thread.sleep  ( 50 );
      } catch ( InterruptedException e ) {}    //soll durch Timer ersetzt werden, da bei sleep die Buttons nicht mehr gedrückt werden können
      // time.stop();
      stift.clearRect(xkreis,ykreis,12,12);
      xkreis=xkreis-3;
      ykreis=ykreis-3;
   }
  void ball()
  {
      while(true){
      if(richtung==123){
        rechtsoben();
      }
      else if(richtung==36){
        rechtsunten();
      }
      else if(richtung==69){
        linksunten();
      }
      else if(richtung==912){
        linksoben();
      }
    }
    }
  void player1clear()
  {
    stift.clearRect(10,y1,15,50);
  }
  void player2clear()
  {
    stift.clearRect(475,y2,15,50);
  }
  void player2malen()
  {
  stift.fillRect(475,y2,15,50);
  }
  void player1malen()
  {
  stift.fillRect(10,y1,15,50);
  }

  public void button1_ActionPerformed(ActionEvent evt) {
  if(y2>25)
  {
    player2clear();
    y2=y2-25;
    y2plus=y2+50;
    player2malen();
  }
  }

  public void button2_ActionPerformed(ActionEvent evt) {
    if(y2<304)
  {
    player2clear();
    y2=y2+25;
    y2plus=y2+50;
    player2malen();
  }
  }

  public void button3_ActionPerformed(ActionEvent evt) {
    if(y1>25)
  {
    player1clear();
    y1=y1-25;
    y1plus=y1+50;
    player1malen();
  }
  }

  public void button4_ActionPerformed(ActionEvent evt) {
    if(y1<304)
  {
    player1clear();
    y1=y1+25;
    y1plus=y1+50;
    player1malen();
  }
  }

  public void button5_ActionPerformed(ActionEvent evt) {
    if(stop==false){button5.setLabel("Stop!");stop=true;}
    else if(stop==true){stop();}
    stift.setColor(Color.black);
    stift.drawLine(0,318,500,318);
    player1malen();
    player2malen();
    ball();
    }
  }
      //by danthe

Würde mich über eine anschauliche Erklärung sehr freuen, da ich noch nicht sehr erfahren bin und wir im Unterricht dem Grund- bzw. Leistungskurs nicht vorgreifen dürfen. :)

MfG,
danthe
 

Dit_

Bekanntes Mitglied
Thread.sleep(..) ist keine so schlechte Idee. Du solltest bloß diese "Ball-Bewegen-Funktion" in einem extra Thread laufen lassen, dann wird nichts mehr gebremst, bzw blockiert ;)

Beispiel, PseudoCode(!):

Java:
SwingUtilities.invokeLater(new Thread("_BEWEGE_BALL_NACH_LINKS_THREAD_") {
                
                @Override
                public void run() {
                    while(nichtAnDerKante) {
                        bewegeLinks();
                        try {
                            Thread.sleep(50);
                        } catch (InterruptedException e) {
                            //
                        }
                    }
                };
});

gruß
 

danthe

Mitglied
Ich hab das versucht und irgendwie ist es nicht anders als vorher. Ich habe sogar den Thread vorher schon definiert und dann t genannt, damit die Methoden t pausieren und nicht irgendeinen Thread, aber ohne Erfolg.
Relevanter Code:
Java:
Thread t= new Thread("ball") {
    @Override
    public void run(){
    ball();}};
Java:
public void button5_ActionPerformed(ActionEvent evt){
    if(stop==false){button5.setLabel("Stop!");stop=true;}
    else if(stop==true){stop();}
    stift.setColor(Color.black);
    stift.drawLine(0,318,500,318);
    player1malen();
    player2malen();
    SwingUtilities.invokeLater(t);
    }

Die Thread.sleeps aus dem Quellcode oben sind jetzt t.sleeps.
 

Cola_Colin

Top Contributor
Thread.sleep ist eine statische Methode, die solltest du nicht auf t aufrufen, sondern innerhalb von ball().

Oder was genau läuft jetzt nicht so, wie gewünscht ?
 

danthe

Mitglied
Wie oben beschrieben wird durch Thread.sleep das ganze Programm pausiert und ich kann die anderen Knöpfe zum Auf- und Abbewegen der Schläger nicht betätigen. Jetzt habe ich zwar das mit SwingUtilities gemacht, aber es passiert immer noch exakt das gleiche: Keine Fehlermeldung, Programm läuft tadellos, aber ich kann die Schläger nciht bewegen (Was vor Starten des Balles möglich ist).
 

Cola_Colin

Top Contributor
SwingUtilites ist hier auch irgendwie fehl am Platz, das fürht doch nur die run() des Thread im EDT aus, was wir doch gar nicht wollen ?

Lasse mal SwingUtilites weg und starte den Thread stattdessen selber mit t.start().
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
MiMa Optimieren einer Methode zum Zentrieren von Fenstern AWT, Swing, JavaFX & SWT 0
P Methode wird nicht überprüft AWT, Swing, JavaFX & SWT 4
P paintComponent-Methode wird dauernd neu aufgerufen AWT, Swing, JavaFX & SWT 2
M passende Reflexion-Methode?? AWT, Swing, JavaFX & SWT 1
M Seltsame Exception bei setVisible(true) Methode in einem JFrame AWT, Swing, JavaFX & SWT 2
M Swing Methode datenLesen() greift auf catchBlock zu? AWT, Swing, JavaFX & SWT 25
K JavaFX unterschiedliche (mehrere Fenster) in seperater Main Methode AWT, Swing, JavaFX & SWT 26
U was bewirkt die methode fill und unterschied zu anderen fill Methoden in 2dgraphics? (Java)? AWT, Swing, JavaFX & SWT 6
H Transparent zeichnen mit drawImage in paintComponent Methode AWT, Swing, JavaFX & SWT 3
Z Methode bei Boolean change neu Ausführen AWT, Swing, JavaFX & SWT 9
T TableView über Methode befüllen AWT, Swing, JavaFX & SWT 10
H Event Handling Thread - Abruf der get-Methode AWT, Swing, JavaFX & SWT 5
L JFrame Gui in anderer Methode aufrufen AWT, Swing, JavaFX & SWT 0
J Rekursive Methode JProgressBar AWT, Swing, JavaFX & SWT 4
A Methode pausieren bis anderes Ereignis ausgeführt AWT, Swing, JavaFX & SWT 2
K Swing Text eines Lables in einer Methode ändern AWT, Swing, JavaFX & SWT 13
1 Swing Progressbar benutzen um Fortschritt einer Methode anzuzeigen AWT, Swing, JavaFX & SWT 4
J Compiler in der JavaFX stop() Methode warten lassen bist eine Aktion in einer anderen Scene gemacht AWT, Swing, JavaFX & SWT 5
L JavaFX Problem beim Aufrufen einer Methode AWT, Swing, JavaFX & SWT 5
J 2D-Grafik Brauche Erklärung von Methode AWT, Swing, JavaFX & SWT 1
L Methode zum Füllen einer ComboBox AWT, Swing, JavaFX & SWT 4
I Methode Draw3DRect und DrawRect AWT, Swing, JavaFX & SWT 2
krgewb 2D-Grafik paint-Methode wird zu oft ausgeführt AWT, Swing, JavaFX & SWT 5
S Zeichen ohne paint-Methode AWT, Swing, JavaFX & SWT 2
K Methode repaint() AWT, Swing, JavaFX & SWT 1
A Methode in bestimmten Intervall ausführen AWT, Swing, JavaFX & SWT 2
J Swing Wann brauche ich @Override vor der paint()-Methode? AWT, Swing, JavaFX & SWT 1
Z jLabel von Methode aus aktualisieren AWT, Swing, JavaFX & SWT 7
Q AWT Methodenaufruf aus actionPerformed-Methode AWT, Swing, JavaFX & SWT 4
G Eine paint-Methode, 2 Welten? AWT, Swing, JavaFX & SWT 3
B Swing Update Swing Komponente bevor Methode startet. AWT, Swing, JavaFX & SWT 4
T Swing Methode in Listener aufrufen AWT, Swing, JavaFX & SWT 3
P keyTyped-Methode AWT, Swing, JavaFX & SWT 1
D JavaFX Java Methoden mit JavaFX Methode kommunizieren lassen? AWT, Swing, JavaFX & SWT 3
M JavaFX Methode nach initialize() aufrufen AWT, Swing, JavaFX & SWT 6
F JavaFX Mit einer Methode auf Stage zugreifen. AWT, Swing, JavaFX & SWT 8
A paint-Methode aufrufen AWT, Swing, JavaFX & SWT 13
C JavaFX Auf Nodes einer FXML-Datei in start Methode zugreifen AWT, Swing, JavaFX & SWT 5
R GUI Element in einer Methode aktualisieren (JTextPane) AWT, Swing, JavaFX & SWT 13
J Swing Problem mit Graphics Methode AWT, Swing, JavaFX & SWT 4
K Swing Durch Methode erzeugte Buttons ansteuern AWT, Swing, JavaFX & SWT 5
S Grafik: Programm kommt nicht zur paint()-Methode AWT, Swing, JavaFX & SWT 6
T LayoutManager Methode, um Bildschirm(fenster) für Aktualisierungen zu blockieren bzw. freizugeben gesucht AWT, Swing, JavaFX & SWT 2
W Paint-Methode in anderer Klasse funktioniert nicht AWT, Swing, JavaFX & SWT 7
S PaintIn - Methode AWT, Swing, JavaFX & SWT 1
J Swing ungewünschter Nebeneffekt bei der repaint() Methode AWT, Swing, JavaFX & SWT 3
A befüllen eines JTables mittels Methode AWT, Swing, JavaFX & SWT 10
K Kann nicht auf GUI Elemente zugreifen, mit einer Methode im Controller klappts, mit der anderen nich AWT, Swing, JavaFX & SWT 10
D JavaFX Interface Initializable - Was machen die Parameter in der Methode inizializeable() ? AWT, Swing, JavaFX & SWT 4
S JLabel-Text in Methode setzen? AWT, Swing, JavaFX & SWT 2
F JavaFX Zugriff auf Controller Methode von einer normalen Klasse aus AWT, Swing, JavaFX & SWT 4
F 2D-Grafik Was ruft die Paint - Methode auf ? AWT, Swing, JavaFX & SWT 2
S JButton u. Label auf paint-Methode AWT, Swing, JavaFX & SWT 1
S Paint Methode ohne implements JPanel AWT, Swing, JavaFX & SWT 1
S Farbe ändern bei der paint-Methode AWT, Swing, JavaFX & SWT 5
J ActionListener soll auf paint() Methode zugreifen AWT, Swing, JavaFX & SWT 1
J Problem mit der paint Methode AWT, Swing, JavaFX & SWT 0
J JLabel während einer methode aktualisieren AWT, Swing, JavaFX & SWT 6
Junb 2D-Grafik paint() Methode bugt? AWT, Swing, JavaFX & SWT 2
T Swing Label aus anderer Methode bearbeiten AWT, Swing, JavaFX & SWT 2
I Paint-Methode von nicht statischen Objekten aufrufen AWT, Swing, JavaFX & SWT 3
C Methode über Buttonklick starten AWT, Swing, JavaFX & SWT 8
S Swing Mit einem Link eine Methode aufrufen AWT, Swing, JavaFX & SWT 2
P Swing Auf Methode zugreifen (am Schlauch steh) AWT, Swing, JavaFX & SWT 5
D JSlider "laggt" nach überschreiben der paint methode AWT, Swing, JavaFX & SWT 2
D Swing DefaultTableModel setValueAt Methode AWT, Swing, JavaFX & SWT 7
J valueChanged()-Methode liefert unbrauchbare Daten AWT, Swing, JavaFX & SWT 4
T Swing JPanel - "Open" Methode? AWT, Swing, JavaFX & SWT 6
P Swing actionPerformed()-Methode funktioniert nicht AWT, Swing, JavaFX & SWT 3
M Applet Bricht Methode zwischendruch ab AWT, Swing, JavaFX & SWT 11
K Per Textfield Methode ausführen AWT, Swing, JavaFX & SWT 6
J Swing JTable - nach Sortieren andere Methode aufrufen AWT, Swing, JavaFX & SWT 2
C Swing Was macht die Methode "setDataProviderCreditShown(boolean b)" AWT, Swing, JavaFX & SWT 4
R Swing Mit Swing eine throws Exception Methode öffnen AWT, Swing, JavaFX & SWT 3
GianaSisters Swing jTable's valueChanged Methode überschreiben AWT, Swing, JavaFX & SWT 2
P EDT Problem? Kein Aufruf der repaint Methode AWT, Swing, JavaFX & SWT 6
A Paint Methode externer auruf AWT, Swing, JavaFX & SWT 5
N Methode zum Prüfen ob Jtextfield verändert worden ist AWT, Swing, JavaFX & SWT 2
K beim Schließen des JFrames, Methode aufrufen AWT, Swing, JavaFX & SWT 3
J AWT Methode paint() AWT, Swing, JavaFX & SWT 4
X Bild via FileChooser in paint-Methode laden AWT, Swing, JavaFX & SWT 2
E Umgang mit der Update Methode AWT, Swing, JavaFX & SWT 38
Screen Fehler bei Get-Methode für ArrayList AWT, Swing, JavaFX & SWT 8
P Swing JPanel über Methode setzen AWT, Swing, JavaFX & SWT 2
A Frage zur Methode matches() AWT, Swing, JavaFX & SWT 2
eskimo328 Java6 Methode in Java5 verwenden (memory leak JInternalFrame) AWT, Swing, JavaFX & SWT 4
T Swing setText()-Methode Funktioniert nicht AWT, Swing, JavaFX & SWT 7
L JLabel Methode setText funktioniert nicht AWT, Swing, JavaFX & SWT 5
S Thread.sleep() in einer methode fürs zeichen AWT, Swing, JavaFX & SWT 3
S Visual Editor mit main Methode AWT, Swing, JavaFX & SWT 3
G paint-Methode kopiert GUI AWT, Swing, JavaFX & SWT 14
F Swing JFrame Methode beim Schließen aufrufen AWT, Swing, JavaFX & SWT 5
D Zwei String Attribute über eine Methode als Zeilen in einer Tabelle darstellen AWT, Swing, JavaFX & SWT 9
H applet Methode aus abstrakter Klasse aufrufen AWT, Swing, JavaFX & SWT 12
S Methode fireTableDataChanged() AWT, Swing, JavaFX & SWT 2
Y Swing Problem mit Main Methode AWT, Swing, JavaFX & SWT 8
E 2D-Grafik Zeichnen außerhalb der "paintComponent"-Methode? AWT, Swing, JavaFX & SWT 5
R Run Methode Probleme AWT, Swing, JavaFX & SWT 2
B Methode setzt nicht das Layout in einer if-Abfrage AWT, Swing, JavaFX & SWT 13
F AWT Probleme mit der paint() methode AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben