Frage zum Multithreading mit JFrame

DJToxica

Grünschnabel
Hallo Leute

Ich hab hier schon einige Male nützliche Infos gefunden doch jetzt komme ich nicht weiter und hab mich mal registriert um meine Frage direkt zu stellen....

Es wird euch vermutlich extrem trivial vorkommen aber ich bin noch ein ziemlicher Beginner...
Ich habe mir erst vor kurzem das Thema Methoden mehr oder weniger angeeignet und hab mir nun das Multithreading angesehen...

An sich ist das ganze ja kein Problem ich hab schon ein paar einzelne Sachen gebastelt doch nun bin ich verwirrt...

Ich hab ein altes Scherzprogramm das ich vor längerer Zeit mal gebastelt habe wieder rausgeholt weil ich dort über Multithreading noch ein paar Sachen dazumachen wollte...

Das Programm lässt ein Dancing Trollface über den Bildschirm rennen also im Quadrat.

Dazu rufe ich in main die Methode auf die mir das Fenster generiert und im 4-Eck bewegen lässt...soweit sogut...das im 4-Eck rennen erreiche ich durch eine While-Schleife.

Hier mal der QuellCode dazu:

Code:
import com.sun.awt.*;
import javax.swing.*;
import java.awt.*;
import javax.sound.sampled.*;
import java.io.*;
import java.applet.*;

public class Troll extends JFrame {
    JLabel label1 = new JLabel(new ImageIcon("trolo.gif"));
    public Troll() {

        super("Troll");
        setUndecorated(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.add(label1);
        pack();
        setVisible(true);
        int i=0;
        int j=0;
        int speed=10; //Je kleiner je schneller
        int x=5;
        int counter=0;
        Dimension screensize = java.awt.Toolkit.getDefaultToolkit().getScreenSize ();
        int width=screensize.width;
        int height=screensize.height;
        
        while (counter<100000)
        {
        while(i<(width-400))
        {
          i=i+x;
          this.setLocation(i,j);
          try{Thread.currentThread().sleep(speed);}catch (InterruptedException e){}

        }
        while(j<(height-400))
        {
          j=j+x;
          this.setLocation(i,j);
          try{Thread.currentThread().sleep(speed);}catch (InterruptedException e){}
        }
        while(i>0)
        {
          i=i-x;
          this.setLocation(i,j);
          try{Thread.currentThread().sleep(speed);}catch (InterruptedException e){}
        }
        while(j>0)
        {
          j=j-x;
          this.setLocation(i,j);
          try{Thread.currentThread().sleep(speed);}catch (InterruptedException e){}
        }
        counter++;
        }
        System.exit(-1);
    }
    public static void main(String[] args) {
        JOptionPane.showMessageDialog(null,"Ich werde gleichzeitig mit dem Trollface dargestellt");
        new Troll();

    }

}

So Jetzt kommt mein Problem...das Bild wird durch JFrame auf einem JLabel dargestellt...dazu habe ich oben extends JFrame (soweit ich weiss hat das was mit Vererbung zu tun oder?) dabei brauche ich ja extends Threads um meine Einzelthreads starten zu können...

Ich hab woanders gelesen das man nicht mehrere Dinge vererben kann. Also was müsste ich machen dass ich meine Methode "Troll" als Thread starten kann?

Vielen Dank schonmal

Ansonsten
LG
DJ
 

sheel

I love Asm
Hi und Willkommen bei tutorials.de,

es ist richtig, dass man in Java nicht 2 oder mehr "Vaterklassen" zu einer anderen haben kann.
Was jedoch mehrfach geht sind Interfaces.

Es gibt eine Alternative für den Thread, die nur Interfaces braucht:
Java:
public class blablub implements Runnable {
    public void run() {
        //Threadinhalt...
    }
}

Gestartet wird das dann so:
Java:
Thread t = new Thread( new blablub() );
t.start();


Gruß
 

I2oxxi

Mitglied
Musste man nicht wenn man irgendwas in nem JFrame als Thread started, der was im JFrame ändert, sowas wie
Java:
Swingutils.invokeLater(Thread);
in der main nach erstellen des frames (der Troll Klasse) machen, weil sonst die gui einfriert / einfrieren kann?
hab irgendwie sowas in erinnerung, kann aber auch falsch liegen :D
 

sheel

I love Asm
Genau, das Problem gibts ja auch noch.
Genaue Schreibweise für Swing müsst ich jetzt selbst nachschauen,
aber das sollte der Threadersteller auch schaffen :google:
 

DJToxica

Grünschnabel
Tut mir leid ich blicks nich...wo bringe ich dann mein JFrame unter weil in dem Bereich Threadinhalt geht das ja nicht da ich hier die JFrame vererbung nicht habe oder muss ich in run() die Methode aus aus einer anderen Klasse aufrufen?

Asnonsten
LG
DJ
 

I2oxxi

Mitglied
Also ich würde sagen, du schreibst dir eine Extra Klasse die als Thread fungiert.
Diese Klasse bekommt in ihrer run() Methode (ob du dort von Thread erbst oder Runnable implementierst ist egal) deine While schleife.
Musst dann halt paar funktionen einbauen das deine Threadklasse auf dein Jframe zugreifen kann.

Und mit der Syntax bin ich mir nicht so sicher. ich glaub du erstells dann den thread am ende der gui, aber anstatt thread.start() machst du dann Swingutils.invokeLater(Thread);

also so würd ichs machen, keine garantie :D
 

DJToxica

Grünschnabel
Gotcha...ich hab nen Fortschritt gemacht...

Mein Programm startet nun...nur hab ich jetzt 2 Trollfaces....eines rennt das andre nicht...

Ich steig nich durch woher das kommen könnte....was mein ihr?

Code:
import com.sun.awt.*;
import javax.swing.*;
import java.awt.*;
import javax.sound.sampled.*;
import java.io.*;
import java.applet.*;
import java.awt.BorderLayout;
import java.awt.EventQueue;

public class Troll extends JFrame implements Runnable{
  JLabel label1 = new JLabel(new ImageIcon("trolo.gif"));
  public Troll() {
    super("Troll");
    Container cp = getContentPane();
    setUndecorated(true);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    cp.add(label1);
    pack();
    setVisible(true);
    
  }
  public void run(){
    Troll pos= new Troll();
    int i=0;
    int j=0;
    int speed=10; //Je kleiner je schneller
    int x=5;
    int counter=0;
    Dimension screensize = java.awt.Toolkit.getDefaultToolkit().getScreenSize ();
    int width=screensize.width;
    int height=screensize.height;
    while (counter<100000)
    {
      while(i<(width-400))
      {
        i=i+x;
        pos.setLocation(i,j);
        try{Thread.currentThread().sleep(speed);}catch (InterruptedException e){}
        
      }
      while(j<(height-400))
      {
        j=j+x;
        pos.setLocation(i,j);
        try{Thread.currentThread().sleep(speed);}catch (InterruptedException e){}
      }
      while(i>0)
      {
        i=i-x;
        pos.setLocation(i,j);
        try{Thread.currentThread().sleep(speed);}catch (InterruptedException e){}
      }
      while(j>0)
      {
        j=j-x;
        pos.setLocation(i,j);
        try{Thread.currentThread().sleep(speed);}catch (InterruptedException e){}
      }
      counter++;
    }
  }
  public static void main(String[] args) {
    Thread t = new Thread( new Troll() );
    t.start();
    JOptionPane.showInputDialog(null,"Trollololololloolo");
  }
  
}


Die Meldung zeigts übrigens gleichzeitig an :p

edit: Ok habs jetzt....hab eine neue Klasse mit dem Fensterbewegen Thread erstellt dann gings :D
 
Zuletzt bearbeitet: