Swing und Threads

Status
Nicht offen für weitere Antworten.

Kaffeebohne

Bekanntes Mitglied
Hallo,

ich habe gelesen das Swing nicht Threadsicher sei. Jetzt frage ich mich warum in der Faq:
http://www.java-forum.org/de/viewtopic.php?t=8101

in der Mainklasse, die von Swings JFrame abgeleitet ist, ein Thread in der Methode start() erzeut wird.

Wie ist das jetzt mit der Threadunsicherheit zu verstehen.


Noch eine andere Frage:

Wenn das in Ordung ist und die Klasse in einem Thread abläuft und man das ganze noch ein bischen so umbaut:

Code:
   protected void start(){
      buttonStart.setEnabled( false );
      
      // Einen neuen Thread herstellen, und starten.
      myThread = new Thread( this );
      myThread.start();
      
      buttonStop.setEnabled( true );
   }


  public void run(){
       while(!myThread.isInterrupted()) {
           switch(algotask) {
               case 1:
                   algoaction1();
                   algotask = 0;
                   break;
               case 2:
                   algoaction1();
                   algotask = 0;
                   break;
               case 3:
                   algoaction1();
                   algotask = 0;
                   break;
           }
           try {
               Thread.sleep(100);
           } catch(Exception e) {
               e.printStackTrace();
           }
       }

Wobei algotask ein Integer ist und die verschiedenen Algorhtymen repräsentert, welche man in unterschiedlicher Reihenfolge ablaufen lassen kann.

Ist das eingentlich in Ordnung so? Also ich meine das die run() Methode in einer Schleife immer rennt und je nach algotask, welchen man über die GUI bestimmen kann ausführt?
 

dotlens

Top Contributor
du kannst wohl in einer GUI klasse einen Thread erzeugen.
Jedoch kannst du nicht (ohne Fehler) in einem Thread auf die GUI zugreifen.
z.b Text ändern, farbe ändern, usw.
 

Kaffeebohne

Bekanntes Mitglied
Okay, also ich rekapituliere:

Man kann die Oberfläche in Swing in einem sepraten Thread erzeugen, mann sollte/darf aber dann nicht von einem anderen Thread die Oberfläche verändern.

Wenn man etwas ändern möchte sollte man die invoke Methoden bentuzten.



Und wie ist es mit der Frage wegen der Schleife, ist das so okay?
 

dotlens

Top Contributor
nö die oberfläche in der main erzeugen.
rechnen kannst du in Threads.

dein run ist ok. aber irgendwie schaut es für mich nach einem endlosen aufruf von myThread aus. da in der start() methode wieder die start() methode aufgerufen wird.
 

Kaffeebohne

Bekanntes Mitglied
In der Orginalfassung des Codes wird der Aufrunf so umgesetzt:



Code:
   protected void start(){
      buttonStart.setEnabled( false );
      
      // Einen neuen Thread herstellen, und starten.
      new Thread( this ).start();
      
      buttonStop.setEnabled( true );
   }

Was anders mache ich ja im Prinzip auch nicht, nur das ich es einer Variablen zuweise um später auf isInterrupted() zugreifen zu können. Oder? Jetzt bin ich auch ein wenig verunsichert.
 

dotlens

Top Contributor
dann wird wohl beim neuen Thread erstellen nicht diese start methode übernommen, sondern die von Thread.
komplizierte sache :)
 
dotlens hat gesagt.:
Jedoch kannst du nicht (ohne Fehler) in einem Thread auf die GUI zugreifen.
z.b Text ändern, farbe ändern, usw.

Hi,

ich bin zwar kein Java Profi, aber es ist möglich Sachen aus der GUI zu ändern vom Thread aus.

Für meine Diplomarbeit an der ich gerade schreibe hatte ich nämlich genau das Problem und es auch gelöst.

Das Hauptfenster enthält einen "Start" Button, mit dem ein neuer Thread erzeugt wird.

Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class Hauptfenster
	extends JFrame{

                MeinThread th;

                Hauptfenster(){
                        ...
                        start = new JButton("Start");
                }

		private void startenGedrückt(ActionEvent e){
			th  = new MeinThread(this);th.start();}
}

Die ThreadKlasse habe ich mir selbst programmiert. Sie sieht in etwa so aus.

Code:
import javax.swing.*;
class MeinThread
	extends Thread{
		
		boolean stop = false;
		private Hauptfenster h;

		public MeinThread(Hauptfenster _h){
			this.h = _h;}

		public void run(){

                        do{Anweisungen;... stop=true;}
                        while(!stop;)
                }



So hat der Thread Zugriff auf alle Komponenten des Hauptfensters und ich kann sie auch verändern.

Z.B. könnte ich den Start Button deaktivieren durch h.start.setEnabled(false); Dasselbe geht mit jeder anderen Komponente der GUI Klasse.

Und ich erreiche noch folgendes: Ich kann über einen anderen Button, bspw. einen Abbrechen Button die Variable stop von MeinThread durch th.stop = true auf wahr setzen und den Thread so von aussen jederzeit stoppen.

Vielleicht hilft dir das ja weiter.

Gruß
Florian
 

Kaffeebohne

Bekanntes Mitglied
So wie ich das sehe ist es doch so das, zum einen dein Hauptfenster in einem Thread läuft und zum anderen die Änderungen im Hauptfenster in der gleichen Klasse, respektive in diesem Fall im gleichen Thread ablaufen.

Deshalb kann es auch nicht zu Kollisionen kommen. Anderes wäre es wenn du in einer anderen Klasse eine Referenz z.B von dem Startknopf hast und diesen veränderst.

Oder liege ich da falsch?


Übrigens, habe ich das jetzt mit der Whileschleife gelöst, das funktioniert wunderbar.
 
Kaffeebohne hat gesagt.:
So wie ich das sehe ist es doch so das, zum einen dein Hauptfenster in einem Thread läuft und zum anderen die Änderungen im Hauptfenster in der gleichen Klasse, respektive in diesem Fall im gleichen Thread ablaufen.

Nein, das Hauptfenster läuft nicht in dem Thread. Das sind 2 völlig unterschiedliche Klassen. Hauptfesnter, welche abgeleitet ist von JFrame und MeinThread, welche abgeleitet ist von Thread. Der Clou ist nur, dass beide eine Klassenvariable vom Typ des anderen besitzten. Das Hauptfenster hat die Variable MeinThread th und der Thread die Variable Hauptfenster h. Der Konstruktor von MeinThread braucht gerade bei der Initialisierung eine Referenz vom Hauptfenster.

Code:
public MeinThread(Hauptfenster _h){
     this.h = _h;}

Weiter hat das Hauptfenster hat einen Start-Button, mit dem eine Simulation gestartet wird. Damit die Simulation aber auch abgebrochen werden kann bzw. der exisitierende Fortschrittsbalken im Hauptfenster auch während die Simulation berechnet wird, hochläuft, muss diese Simulation in einem Thread laufen. Dieser wird initialisiert, in dem ich auf den Start-Button drücke.

Code:
private void startenGedrückt(ActionEvent e){
     th  = new MeinThread(this);//this zeigt auf das aktuelle Hauptfenster
     th.start();}

Der Thread liest nun alle möglichen Einstellungen aus dem Hauptfenster, deaktiviert den Start-Button, aktiviert den Abbrechen-Button, etc...

Code:
public void run(){
     do{
          h.startButton.setEnabled(false);
          h.abbrechenButton.setEnabled(true);
          //START DER SIMULATION //Einstellungen werden aus dem Hauptfenster gelesen, etc.
          //damit der Thread nach allen Aktion selbstständig stopt und nicht endlos weiter läuft,
          //muss stop am Ende auf true gesezt werden
          stop=true;}
     while(!stop;)}

Der Abbrechen-Button macht auch nur folgendes. Wenn man drauf klickt, wird die Klassenvariable stop von MeinThread auf true gesetzt.

Code:
private void abbrechenGedrückt(ActionEvent e){
         th.stop = true;}

So wird der Thread gestoppt und man könnte nun noch eine Methode init() Aufrufen, die alle Einstellungen und Komponenten des Hauptfensters wieder auf den Startzustand umstellt.

Zu einer Kollision kommt es so nicht :)
 

Kaffeebohne

Bekanntes Mitglied
Das heisst man kann solange von einem anderen Thread das Hauptfenster verändern, solange man dem Thead eine Referenz übergibt.

Wenn ich aber nur dem Thread, z.B nur den Button übergebe muss ich mit Invoke arbeiten, oder?
 
Den ersten Satz kann ich bestätigen, das funktioniert, vor allem fehlerfrei.

Invoke? :roll: (Sorry, hab mit Java erst vor 5 Monaten angefangen)

Aber! Wenn man ein ganzes Fenster als Referenz übergeben kann, dann logischerweise auch einzelne Komponenten wie Buttons etc., würd ich als Laie jetzt einfach mal so behaupten. Ich würde das dann so machen, indem ich eine Referenz des Buttons übergebe (so wie ich es beim Hauptfenster gemacht habe), vielleicht gibts aber auch eine viel einfachere Lösung.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Swing ProgressBar über 2 parallel laufende Threads AWT, Swing, JavaFX & SWT 2
C Threads Swing AWT, Swing, JavaFX & SWT 11
S Java Swing GUI mit MVC und Threads AWT, Swing, JavaFX & SWT 6
B Threads in Swing AWT, Swing, JavaFX & SWT 4
R Swing Java Swing Gui und nebenläufige Threads AWT, Swing, JavaFX & SWT 4
R Swing Swing und die Threads AWT, Swing, JavaFX & SWT 9
B Frage zu Swing,Threads, SwingWorker und Socket Communikation AWT, Swing, JavaFX & SWT 4
A Swing und Threads AWT, Swing, JavaFX & SWT 8
R Swing & Threads AWT, Swing, JavaFX & SWT 4
P Threads und Swing bzw. AWT AWT, Swing, JavaFX & SWT 15
W Swing, 2 JProgressbars und threads geht das? AWT, Swing, JavaFX & SWT 2
M Threads in Swing? AWT, Swing, JavaFX & SWT 2
V Swing & Threads ??? AWT, Swing, JavaFX & SWT 3
Juelin javax.swing in javafx AWT, Swing, JavaFX & SWT 1
A Eclipse 2023 und Swing AWT, Swing, JavaFX & SWT 4
W 2 JTables in einem Swing-Fenster? AWT, Swing, JavaFX & SWT 5
H Swing Componente zur Läufzeit ändern AWT, Swing, JavaFX & SWT 3
B Actionlistener mit Java Swing AWT, Swing, JavaFX & SWT 2
W Gibt es einen "automatischen Listener" in Swing oder JTable oder der ATM-Klasse? AWT, Swing, JavaFX & SWT 14
H Swing Buttons erst nach Klick sichtbar AWT, Swing, JavaFX & SWT 13
ExceptionOfExpectation Anpassung von JKomponentengrößen (Swing) AWT, Swing, JavaFX & SWT 3
thor_norsk AWT SWING Aufgabe AWT, Swing, JavaFX & SWT 7
U Zwei Fragen zu eienr Swing Aufgabe AWT, Swing, JavaFX & SWT 2
M Swing Bilder in Swing anzeigen AWT, Swing, JavaFX & SWT 9
H Swing , GridLayout, Größenbestimmung der Komponenten im Layout AWT, Swing, JavaFX & SWT 8
H Simple Animation mit Swing AWT, Swing, JavaFX & SWT 2
Guybrush Threepwood Einfachste Möglichkeit zum Abspielen eines Videos in Swing AWT, Swing, JavaFX & SWT 4
M Swing GridLayout AWT, Swing, JavaFX & SWT 2
O return-Statement mit Swing AWT, Swing, JavaFX & SWT 6
O Ein Java-Programm mit Swing steuern AWT, Swing, JavaFX & SWT 1
Monokuma Swing zu JavaFX AWT, Swing, JavaFX & SWT 5
J Swing Slider AWT, Swing, JavaFX & SWT 11
G Thread starten Swing AWT, Swing, JavaFX & SWT 5
G Swing JPasswordField AWT, Swing, JavaFX & SWT 12
L Swing Button Farbe ändern/wechseln AWT, Swing, JavaFX & SWT 2
C Swing AWT GUI Anfänger Aufgabe AWT, Swing, JavaFX & SWT 7
W Inject bei einem Swing Frontend AWT, Swing, JavaFX & SWT 8
L Kommunikation zwischen Klassen / Konstruktoren bei Swing AWT, Swing, JavaFX & SWT 9
M Feldvalidierung swing AWT, Swing, JavaFX & SWT 4
E Swing Componenten werden nach Änderung des display modes verzerrt dargestellt AWT, Swing, JavaFX & SWT 8
D [Swing] Anordnung von Komponenten mit GridLayout Manager AWT, Swing, JavaFX & SWT 13
O Zukunft von Swing und JavaFX ? AWT, Swing, JavaFX & SWT 3
S Swing Fenster State Machine AWT, Swing, JavaFX & SWT 1
T Swing Swing an Bildschirm anpassen AWT, Swing, JavaFX & SWT 3
S Swing Panel wird nicht neu gezeichnet AWT, Swing, JavaFX & SWT 3
M Swing Java Swing/AWT Combobox Bug AWT, Swing, JavaFX & SWT 3
M Swing GUI mittels erben sowie variabler Dateninhalt AWT, Swing, JavaFX & SWT 1
W Swing Multitouch mit Swing AWT, Swing, JavaFX & SWT 6
S Swing-Applikation die ein Numpad nachbildet samt Keybindings..? AWT, Swing, JavaFX & SWT 5
S Swing Java Swing AWT, Swing, JavaFX & SWT 6
Blender3D Problem mit € Symbol Font Gotham Windows 10 Swing AWT, Swing, JavaFX & SWT 11
J Swing oder JavaFX AWT, Swing, JavaFX & SWT 21
D Swing Anwendung ohne JPanel erstellen AWT, Swing, JavaFX & SWT 1
D SQL Statements mit Java Swing benutzen AWT, Swing, JavaFX & SWT 4
Damtonix BufferStrategy flackert (Swing) AWT, Swing, JavaFX & SWT 9
D DatePicker für Java Swing AWT, Swing, JavaFX & SWT 2
B JavaFX oder swing AWT, Swing, JavaFX & SWT 3
T Java Swing - kleines Rechteck unter dem cursor AWT, Swing, JavaFX & SWT 5
L 2D-Grafik Swing paint|paintComponent AWT, Swing, JavaFX & SWT 2
L Swing Größe automatisch anpassen AWT, Swing, JavaFX & SWT 14
G Swing Swing Binding JList funktioniert nicht AWT, Swing, JavaFX & SWT 5
Blender3D Meine Swing Anwendung läuft unter Windows 10 und Ubuntu aber nicht auf Windows 7 AWT, Swing, JavaFX & SWT 16
B Bar Plot in Swing JPanel AWT, Swing, JavaFX & SWT 0
D Swing in Kombination mit JGraphX und JGraphT AWT, Swing, JavaFX & SWT 0
F main-Funktion bei Swing AWT, Swing, JavaFX & SWT 4
S Java Swing Print() method AWT, Swing, JavaFX & SWT 4
S Java Swing auf Windows Phone AWT, Swing, JavaFX & SWT 6
I JAVAFX - Übergabe der Inhalte an eine Scene - Wo ist der Vorteil gegenüber Swing? AWT, Swing, JavaFX & SWT 2
S Manuelles Menu in Swing AWT, Swing, JavaFX & SWT 3
T Custom Window ohne Swing / AWT / FX..?! AWT, Swing, JavaFX & SWT 1
MaxG. Swing Swing Komponenten zur Laufzeit hinzufügen AWT, Swing, JavaFX & SWT 2
Java_RY Bin Ratlos bzgl Malen in Swing AWT, Swing, JavaFX & SWT 5
offi Swing Shuttle List AWT, Swing, JavaFX & SWT 9
I Graph mit Swing zeichnen AWT, Swing, JavaFX & SWT 8
D Swing Swing Objekte sehen im Entwurf anders aus als beim Ausführen AWT, Swing, JavaFX & SWT 3
S Swing & Clean und build Problem AWT, Swing, JavaFX & SWT 12
javampir Swing repaint in JavaFX Anwendung AWT, Swing, JavaFX & SWT 3
K Mit JavaFX angefangen. Lohnt sich Swing? AWT, Swing, JavaFX & SWT 28
B Swing Update Swing Komponente bevor Methode startet. AWT, Swing, JavaFX & SWT 4
B Swing Tabelle(JTable) filtern swing GUI AWT, Swing, JavaFX & SWT 3
M Swing Swing-Widgets und paintComponent() AWT, Swing, JavaFX & SWT 2
B Swing WindowBuilde: Menu -> anderes Panel wechseln AWT, Swing, JavaFX & SWT 1
K eigener button in swing AWT, Swing, JavaFX & SWT 3
A JavaFX DatePicker in Swing beim Start nicht sichtbar AWT, Swing, JavaFX & SWT 2
windl Bufferstrategy in Swing nachstellen AWT, Swing, JavaFX & SWT 0
M Kamera in Java Swing einbinden AWT, Swing, JavaFX & SWT 4
Z Swing Swing und die Progressbar AWT, Swing, JavaFX & SWT 1
J Frage zur objektorentierten Swing Programmierung AWT, Swing, JavaFX & SWT 10
Xanny 2D-Grafik Beginner! Probleme mit Swing, Gprahics class und paint AWT, Swing, JavaFX & SWT 13
F Java Swing Rechteck in JPanel zeichnen AWT, Swing, JavaFX & SWT 7
N Swing Benötige Hilfe um ein Swing Canvas zu speichern AWT, Swing, JavaFX & SWT 4
stylegangsta JButton Fehelr javax.swing.ImageIcon.<init>(Unknown Source) AWT, Swing, JavaFX & SWT 24
RalleYTN Swing JavaFX VideoPlayer in Swing einbetten. Ich komm nicht an die Dimension des Videos! AWT, Swing, JavaFX & SWT 0
T swing läuft nur beding flüssig AWT, Swing, JavaFX & SWT 1
A Sonderzeichen bei Swing AWT, Swing, JavaFX & SWT 3
L DoubleBuffering unter Swing AWT, Swing, JavaFX & SWT 0
N Programm mit Swing und Thread, Figur bewegen sich nicht AWT, Swing, JavaFX & SWT 6
D Java Swing, Label lässt sich nicht mit Checkboxen/Knopf verändern AWT, Swing, JavaFX & SWT 2
J Swing Basics - JButton funktioniert nicht. AWT, Swing, JavaFX & SWT 1
J Swing/AWT | Dynamisch erzeugte Objekte ansprechen AWT, Swing, JavaFX & SWT 1

Ähnliche Java Themen

Neue Themen


Oben