[Java] Threads :(

NudelMC

Well-known member
ID: 46722
L
16 Juni 2006
178
5
Erstmal danke an alle für die Hinweise, aber nu gehts weiter mit den Threads :)

PHP:
  public void button1ActionPerformed(ActionEvent evt) {
  new Thread(new zahlen()).start();
  }
war mein ansatz, dachte eigentlichd as wäre so richtig, allerdings sagt mir der Compiler
"Error can not find Symbol"
und zeigt auf
PHP:
new Thread


in der funtion zahlen() steht immer noch


PHP:
public void zahlen(){
  Random generator = new Random();
  for(int i =0; i<= 10;i++){
         try{
         Thread.sleep(500);
         position1 = generator.nextInt(8);
         position2 = generator.nextInt(8);
         position3 = generator.nextInt(8);
         System.out.println("position1: " + position1);
         repaint();
         }catch(InterruptedException ie){
         }
  }
  }


Danke für eure Hilfe







Hallo,
ich habe mal wieder ein Problem mit der Graphics funktion in Java in verbindung mit AWT.

Wenn ich direkt im konstruktor die funktion zahlen() aufrufe wird sie korrekt aufgerufen, die zufallszahlen ereugt und mit 80 ms verzögerung aufgerufen.

Wenn ich nun aber die Function in den Actionperformed event des buttons ( button1) setzte wird scheint der befehl repaint() ignoriert zu werden.

Es werden zwar auch erfolgreich die zahlen ermittelt, aber der repaint() befehlt wird nur beim letzten Schleifen durchlauf ausgeführt :(

Wäre dankbar für Hilfe
(Die Bilder findet ihr hier https://www.progam0r.de/klamm/bilder.zip)




PHP:
import java.awt.*;
import java.awt.event.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Random;

public class sdu extends Frame {
  // Anfang Variablen
  Image[] im = new Image[8];
  int position1;
  int position2;
  int position3;
  private Button button1 = new Button();
  // Ende Variablen

  public sdu(String title) {
    // Frame-Initialisierung
    super(title);
    addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent evt) { System.exit(0); }
    });
    int frameWidth = 902;
    int frameHeight = 600;
    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);
    setLayout(null);

    // Bilder Einfügen
    im[0] = Toolkit.getDefaultToolkit().createImage( "bild_01.jpg" );
    im[1] = Toolkit.getDefaultToolkit().createImage( "bild_02.jpg" );
    im[2] = Toolkit.getDefaultToolkit().createImage( "bild_03.jpg" );
    im[3] = Toolkit.getDefaultToolkit().createImage( "bild_04.jpg" );
    im[4] = Toolkit.getDefaultToolkit().createImage( "bild_05.jpg" );
    im[5] = Toolkit.getDefaultToolkit().createImage( "bild_06.jpg" );
    im[6] = Toolkit.getDefaultToolkit().createImage( "bild_07.jpg" );
    im[7] = Toolkit.getDefaultToolkit().createImage( "bild_08.jpg" );

    // Programm Icon in der Titelzeile setzen
    setIconImage(im[0]);
    // Anfang Komponenten
    // Ende Komponenten
             button1.setBounds(88, 216, 75, 25);
    button1.setLabel("button1");
    add(button1);
    
      button1.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        button1ActionPerformed(evt);
      }
    });
    setResizable(false);
    setVisible(true);

//////////////////////////////
//////////////////////////////
//////////////////////////////
// Wenn ich hier aufrufe gehts
zahlen();
  }

  public void zahlen(){
  Random generator = new Random();
  for(int i =0; i<= 10;i++){
         try{
         Thread.sleep(500);
         position1 = generator.nextInt(8);
         position2 = generator.nextInt(8);
         position3 = generator.nextInt(8);
         ///////////////////////////////////
        ///////////////////////////////////
       ///////////////////////////////////
      // Wird anscheinend bei klick auf den Button ignoriert

         repaint();
         }catch(InterruptedException ie){
         }
  }
  }
  

public void paint( Graphics g ) {
     g.drawImage(im[position1],50,40,this);
     g.drawImage(im[position2],325,40,this);
     g.drawImage(im[position3],600,40,this);
}
  // Anfang Ereignisprozeduren
  // Ende Ereignisprozeduren
  public void button1ActionPerformed(ActionEvent evt) {
//////////////////////////////
//////////////////////////////
//////////////////////////////
// wenn ich hier klicke gehts nicht :(
  zahlen();
  }
  public static void main(String[] args) {
    new sdu("Slots");
  }
}
 
Zuletzt bearbeitet:
das ich mit dem AWt gearbeitet habe ist einen mom her (swing ist doch netter^^) aber hätte repaint nicht gerne noch den parameter g (für die grafiken) ?
 
also dein code funtktioniert... aber halt nicht so wie er soll.
Grund dafür dürfte meines Wissens die Paint Methode und dein ActionListner sein. Beides läuft ja als Thread neben deinem Proggy. Die Paint Methode wird durch deinen ActionListner unterbrochen und malt halt nicht mehr bis der ActionListner fertig ist. Dieser ruft repaint auf aber der Befehl wird erstmal gespeichert und später ausgeführt. Deswegen funzt es ja wenn du es ohne actionListner aufrufst.

Hoffe ist verständlich was ich Meine. Ich würde dir vorschlagen nen timer mit reinbauen der aktiviert wird wenn du den actionlistner aufrufst und der das dann übernimmt.

mfg
Samy

P:S: repaint(void) passt scho ;)
 
jetzt ne blöde Frage, aber Events in AWT sind doch net mit threads gelöst oder? Ich meine das wären ganz normale synchrone funktionen.
 
Beim AWT und bei Swing gibt es einen Thread, der für die Oberflächenelemente verantwortlich ist: den AWT-Thread. Er läuft parallel zum Hauptprogramm (ein Thread namens main) und führt den Programmcode in den Listenern aus. Aus diesem Grund ist es auch ungünstig, in einen Event-Handler langen Programmcode zu legen, denn dann »steht« die grafische Applikation und lässt sich nicht fortsetzen, weil der AWT-Thread blockiert ist. Bei einer Aktion in einem Event-Handler sollten wir einen separaten Thread starten, damit die grafische Oberfläche sofort wieder reaktionsfähig ist.

Quelle

Also da ist nochmal bischen besser Antwort von dem was ich sagen wollte.

mfg
Samy

edit: seh ja grad also wenn du keine lust auf timer hast, nen seperaten thread tut es auch (steht ja oben mit)
 
mh da ich keine ahnung von Threads und timern habe ist es eigentlich relativ egal auf was ich lust habe :)

Muss ich mir erst aneignen.

Aber danke für die Antworten, jetzt weis ich das ich net vollkommen beklöppt bin :p
 
Erstmal danke an alle für die Hinweise, aber nu gehts weiter mit den Threads :)

PHP:
  public void button1ActionPerformed(ActionEvent evt) {
  new Thread(new zahlen()).start();
  }

war mein ansatz, dachte eigentlichd as wäre so richtig, allerdings sagt mir der Compiler
"Error can not find Symbol"
und zeigt auf
PHP:
new Thread


in der funtion zahlen() steht immer noch


PHP:
public void zahlen(){
  Random generator = new Random();
  for(int i =0; i<= 10;i++){
         try{
         Thread.sleep(500);
         position1 = generator.nextInt(8);
         position2 = generator.nextInt(8);
         position3 = generator.nextInt(8);
         System.out.println("position1: " + position1);
         repaint();
         }catch(InterruptedException ie){
         }
  }
  }


Danke für eure Hilfe
 
Das soll doch mehr oder weniger ein slot darstellen.
Warum nimmst du dann nicht ein Objekt welches für die Darstellung managed und nen Objekt welches dir alles berechnent, Usereingaben bearbeitet usw. ? Man muss doch nicht alles in ein Objekt drücken (man kanns auch übertreiben hab ich auch schon gesehen 5 Objekte nur mit 1 funktion).
Jetzt mit 1 Animation ist das noch übersichtlich aber wenn du 20-30 Animationen drinnen haben willst dann viel spass mit 30 Threads ;)

nur mal so als kleinen Denkanstoss in eine andere Richtung.

Für deinen Fall Brechstange und durch (mach ich ab und an) könntest deiner Klasse sdu noch nen implements Runable hinzufügen und dann in den Run befehl den aufruf von zahlen übergeben. Oder du schreibst nen Noname Klasse welche deine zahlen-Methode auch aufruft. Oder wie bartman vorgeschlagen ne komplett neue Klasse, aber dann hat man wieder das problem mit den Varis ;).

Auf jeden Fall würd ich nochmal die Grundlagen anschauen also nicht bei Hello World anfangen, sondern allgemein Klassen Threads und Events ;).

mfg
Samy
 
Hehe das Problem ist das ist für die Schule und muss Montag fertig sein, ich hatte es eigentlich schon fertig, aber mein Lehrer meinte in der graphics funktion darf NUR das bild erzeugt werden, ich hatte da alles mögliche noch mit reingebaut was ich jetzt aus der funktion drausen hab was mir jetzt Probleme bereitet :(

I keep on testing !
Danke für die Hilfe!

PS:
Ich hab hier "jetzt lerne ich Java 5 " von markt und Technik neber mir liegen, was leider zu dem Thema nicht viel her gibt :(
 
Zuletzt bearbeitet:
aber mein Lehrer meinte in der graphics funktion darf NUR das bild erzeugt werden
:LOL: :LOL:

no comment

edit: natürlich kann man in die paint ne berechnung mit reinnehmen aber ich glaub du hattest das thread.sleep auch mit drinnen? weil das wäre dann wieder naja nicht wircklich sinnvolle verwendung....
 
Zuletzt bearbeitet:
sooo kinners :)

Es läuft !!!
habs jetzt einfach über das implement runable gemacht, is villeicht net so dolle aber das is mir sowas von grad egal

Danke an alle!