thread nimmt veränderte boolean nicht

Pascale07

Mitglied
Ich lasse aktuell durchgehend eine while schleife in einem anderen Thread laufen. Dort werden public booleans aus dieser Klasse geprüft. Ist eine boolean true, soll in einer anderen Klasse ein JPannel erstellt werden und einem JFrame hinzugefügt werden. Jetzt ist in einem JPannel ein button, der eine der Variablen auf true setzt. Trotz dessen passiert nichts. Wenn ich die Variable aber manuel auf true setzte macht er es. Kann mir jemand sagen, wie ich das Problem lösen kann?

Der Code:

public class Start implements Runnable{

public boolean running = true;
public boolean multi = false;
public boolean single = false;
public boolean Startscreens = true;
public static JFrame window = new JFrame();

public static void main(String[] args){

window.setLocationRelativeTo(null);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setTitle("Monopoly");
window.setResizable(false);
window.setVisible(true);
window.setLocationRelativeTo(null);


Start start = new Start();
start.startGameThread();


}

public void startGameThread(){
Thread gameThread;
gameThread = new Thread(this);
gameThread.start();
}


@Override
public void run(){

gamePanel panel = new gamePanel();
startscreen Startscreen = new startscreen();

while(running){

if(Startscreens){

window.add(Startscreen);
window.pack();
window.setLocationRelativeTo(null);
start.Startscreens = false;

}

if(multi){ //dieses boolean wird mit dem button verändert, trotz dessen wir der Code in der if nicht ausgeführd

window.add(panel);
window.pack();
window.setLocationRelativeTo(null);
start.multi = false;

}

}

}


}



public startscreen(){

gamePanel Gamepannel = new gamePanel();
Start start = new Start();

this.setPreferredSize(new Dimension(Gamepannel.width, Gamepannel.height));
this.setDoubleBuffered(true);
this.setFocusable(true);
this.setVisible(true);


JButton multiplayer = new JButton("MULTIPLAYER");
multiplayer.setVisible(true);
multiplayer.setPreferredSize(new Dimension(300, 100));

multiplayer.addActionListener(new ActionListener(){

public void actionPerformed(ActionEvent e){

start.multi = true;

}

});

this.add(multiplayer);


}

}
 

KonradN

Super-Moderator
Mitarbeiter
Erst einmal: Code bitte immer in Code Tags posten! Also einfach den Knopf </> links oberhalb des Eingabebereiches nutzen!

Zu Deinem Problem: Java "cached" Variablen zwischen Threads. Wenn Du auf eine Variable mit mehreren Threads zugreifen willst, dann sollte die Variable volatile sein.

Dazu kannst Du im Internet sehr viel finden. Ein Baeldung Beitrag erläutert die Hintergrund ebenfalls:
 

Pascale07

Mitglied
Erst einmal: Code bitte immer in Code Tags posten! Also einfach den Knopf </> links oberhalb des Eingabebereiches nutzen!

Zu Deinem Problem: Java "cached" Variablen zwischen Threads. Wenn Du auf eine Variable mit mehreren Threads zugreifen willst, dann sollte die Variable volatile sein.

Dazu kannst Du im Internet sehr viel finden. Ein Baeldung Beitrag erläutert die Hintergrund ebenfalls:
Irgendwas scheine ich nicht verstanden zu haben. Wenn ich die Variable als volatile deklariere und diese dann verändere, wird die if-Anweisung trotzdem nicht ausgeführt. Zudem hatte ich gelesen, dass es reichen würde, dass eine variable public ist um von allen Threads gelesen werden zu können. Wenn ich jetzt was falsch verstanden habe, lassen sie es mich bitte wissen.
Trotzdem danke für ihre Hilfe
 

KonradN

Super-Moderator
Mitarbeiter
Du hast auch noch ein weiteres Problem:

Du hast zwei Instanzen von Start. Das ist wie, wenn Du zwei Autos hast: Wenn Du in den Kofferraum des einen Autos etwas legst, dann wirst Du es im Kofferraum des zweiten Autos nicht finden!

Das ist aber blöd zu sehen, da der Code so nicht formatiert ist. Wäre super, wenn Du den Code noch einmal in Code Tags posten würdest (über den </> Knopf!).
 

KonradN

Super-Moderator
Mitarbeiter
Ich habe jetzt versucht durch den Code zu schauen, aber da scheint etwas nicht zu stimmen - public startscreen(){ muss doch ein Konstruktor sein, damit es valide ist, aber ich habe nur die Klasse Start gesehen? Oder übersehe ich etwas?

Wenn Du zwei Klassen hast, dann sollte der Konstruktor von startscreen eine Instanz von Start nehmen. Dann wird die Initialisierung zu
startscreen Startscreen = new startscreen(this);

Die Instanz von Start speichert Su dann in einer Instanzvariable, d.h. Du erzeugst da keine neue Instanz mehr sondern nutzt die übergebene.

Und schon klappt es mit den Zugriffen.
 

Pascale07

Mitglied
Also ich lade jetzt nochmal den Code richtig hoch. Allerdings verstehe ich die Erklärung nicht. Wenn ich dort this eintrage, dann bekomme ich einen Error, dass der konstruktor startscreen in der Klasse startscreen nicht auf den angegebenen Typen angewendet werden kann. Tut mir leid, dass ich so begriffsstutzig bin. Ich bin recht neu in java und dachte mir ich lerne am Besten, wenn ich einfach ein Projekt starte.

Java:
import javax.swing.*;

public class Start implements Runnable{
    
  public volatile boolean running = true;
  public volatile boolean multi = false;
  public volatile boolean single = false;
  public volatile boolean Startscreens = true;
  public static JFrame window = new JFrame();
 
  public static void main(String[] args){
      
    window.setLocationRelativeTo(null);
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    window.setTitle("Monopoly");
    window.setResizable(false);
    window.setVisible(true);
    window.setLocationRelativeTo(null);
    
    
    Start start = new Start();
    start.startGameThread();
    
    
  }
 
  public void startGameThread(){
    Thread gameThread;
    gameThread = new Thread(this);
    gameThread.start();
  }
 
 
  @Override
  public void run(){
    
    gamePanel panel = new gamePanel();
    startscreen Startscreen = new startscreen();
        
    while(running){
      
      System.out.println(multi);
      
      if(Startscreens){
        System.out.println("ki");   
        window.add(Startscreen);
        window.pack();
        window.setLocationRelativeTo(null);
        Startscreens = false;
        
      }
      
      if(multi == true){
        System.out.print("hi"); 
        window.add(panel);
        window.pack();
        window.setLocationRelativeTo(null);
        multi = false;
          
      }
      
      try{
         Thread.sleep(1000);
      }catch(Exception e){}
      
    }
    
  }
 
 
}
Java:
public class startscreen extends JPanel{
 
  public startscreen(){
      
    gamePanel Gamepannel = new gamePanel();
    Start start = new Start();
    
    this.setPreferredSize(new Dimension(Gamepannel.width, Gamepannel.height));
    this.setDoubleBuffered(true);
    this.setFocusable(true);
    this.setVisible(true);
 
 
    JButton multiplayer = new JButton("MULTIPLAYER");
    multiplayer.setVisible(true);
    multiplayer.setPreferredSize(new Dimension(300, 100));
 
    multiplayer.addActionListener(new ActionListener(){
      
      public void actionPerformed(ActionEvent e){
        
        Start start = new Start();
        start.multi = true;
            
      } 
    
    });
 
 
    JButton singleplayer = new JButton();
 
    this.add(multiplayer);
 
    
  }
 
}
 

KonradN

Super-Moderator
Mitarbeiter
Du musst die KLasse startscreen natürlich auch anpassen, so dass der Konstruktor eine Instanz von Start entgegen nimmt. Also das, was ich hier geschrieben habe:
Wenn Du zwei Klassen hast, dann sollte der Konstruktor von startscreen eine Instanz von Start nehmen.
Die Instanz von Start speichert Su dann in einer Instanzvariable

Das würde dann so aussehen:
Java:
public class startscreen extends JPanel{
  private Start start;  // Du hast jetzt eine Instanzvariable.
    
  public startscreen(Start start){ // Hier hast Du jetzt einen Parameter
      
    gamePanel Gamepannel = new gamePanel();
    this.start = start;  // Und hier speicherst Du, was Du im Parameter bekommen hast
    
    this.setPreferredSize(new Dimension(Gamepannel.width, Gamepannel.height));
    this.setDoubleBuffered(true);
    this.setFocusable(true);
    this.setVisible(true);
 
 
    JButton multiplayer = new JButton("MULTIPLAYER");
    multiplayer.setVisible(true);
    multiplayer.setPreferredSize(new Dimension(300, 100));
 
    multiplayer.addActionListener(new ActionListener(){
      
      public void actionPerformed(ActionEvent e){
        
// Diese Zeile muss natürlich auch weg!
//        Start start = new Start();
        start.multi = true;
            
      }
    
    });
 
 
    JButton singleplayer = new JButton();
 
    this.add(multiplayer);
 
    
  }
 
}

Und es gab noch eine weitere Änderung - Du darfst in dem ActionListener natürlich keine neue Instanz schaffen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
N JFrame loescht alles, sobald der Thread zuende ist AWT, Swing, JavaFX & SWT 22
M Server/Client thread von GUI Trennen AWT, Swing, JavaFX & SWT 2
K JavaFx, Sound Aufnahme und Thread AWT, Swing, JavaFX & SWT 0
T Exception in thread "main" java.lang.NoClassDefFoundError AWT, Swing, JavaFX & SWT 4
G Exception javafx Thread -> caused by removing children while in EventHandler AWT, Swing, JavaFX & SWT 28
H Event Handling Thread - Abruf der get-Methode AWT, Swing, JavaFX & SWT 5
J "Exception in thread "AWT-EventQueue-0"" Fehler AWT, Swing, JavaFX & SWT 3
G Thread starten Swing AWT, Swing, JavaFX & SWT 5
C Thread verwalten AWT, Swing, JavaFX & SWT 2
A Swing Exception in thread "AWT-EventQueue-0" AWT, Swing, JavaFX & SWT 1
S JavaFX Exception in thread "JavaFX Application Thread" AWT, Swing, JavaFX & SWT 3
L Label im JavaFX Thread Updaten AWT, Swing, JavaFX & SWT 3
ralfb1105 JavaFX Alert Confirmation Dialog aus einem Service Thread AWT, Swing, JavaFX & SWT 8
ralfb1105 JavaFX MVC: Thread in Model Class mit Ausgabe in TextArea AWT, Swing, JavaFX & SWT 10
D Swing SwingUtils / Thread Problem AWT, Swing, JavaFX & SWT 3
J Thread per Button starten AWT, Swing, JavaFX & SWT 10
J Thread kennt JButton nicht. AWT, Swing, JavaFX & SWT 11
T JavaFX Task / Thread / FXThread Komplikationen AWT, Swing, JavaFX & SWT 5
O Swing Event Dispatch Thread AWT, Swing, JavaFX & SWT 1
L JavaFX UI Thread block AWT, Swing, JavaFX & SWT 13
X Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1 AWT, Swing, JavaFX & SWT 6
sandaime Swing Thread für CMD auslesen AWT, Swing, JavaFX & SWT 16
E JavaFX JavaFX Application in Thread ausführen AWT, Swing, JavaFX & SWT 1
D JavaFX UI-Thread und DB-Thread trennen um z.B. Ladebalken anzuzeigen AWT, Swing, JavaFX & SWT 15
T JavaFX Controller im extra Thread AWT, Swing, JavaFX & SWT 0
T Swing 2 Thread.sleep parallel laufen lassen AWT, Swing, JavaFX & SWT 4
L Zweites Fenster mit Thread AWT, Swing, JavaFX & SWT 0
E JavaFX Stage.show() in ursprünglichem Thread starten AWT, Swing, JavaFX & SWT 7
L Swing Frame in Thread wird nicht gezeichnet AWT, Swing, JavaFX & SWT 2
N Programm mit Swing und Thread, Figur bewegen sich nicht AWT, Swing, JavaFX & SWT 6
C Im ActionListener Buttons disablen, einen Thread starten, dann Buttons enablen AWT, Swing, JavaFX & SWT 2
C Thread-/ Simulations- Problem AWT, Swing, JavaFX & SWT 18
T Swing Button bleibt grau [=> UI hat sich aufgehängt, Aufgabe in Thread auslagern] AWT, Swing, JavaFX & SWT 3
M Thread-Frage in SWT AWT, Swing, JavaFX & SWT 1
Q GUI außerhalb GUI-Thread updaten - GUI friert ein AWT, Swing, JavaFX & SWT 18
C Thread in Klassen starten AWT, Swing, JavaFX & SWT 4
L exception in thread awt-eventqueue-0 java.lang.nullpointerexception AWT, Swing, JavaFX & SWT 2
S Swing Exception in thread "AWT-EventQueue-0" bei Jlabel AWT, Swing, JavaFX & SWT 4
D SWT SWT Elemente aus anderen Klassen aufrufen - Invalid thread access AWT, Swing, JavaFX & SWT 6
K JavaFX Tableview mit fxml ohne Aktualiserung trotz Thread AWT, Swing, JavaFX & SWT 13
K Event Handling 2 Buttons und Thread stop AWT, Swing, JavaFX & SWT 3
C Swing Update von swing-TableModels per Thread. Eins geht, das andere nicht, warum? AWT, Swing, JavaFX & SWT 12
V JLabel bzw. GUI aus externen Thread ansteuern AWT, Swing, JavaFX & SWT 3
J Applet Paralleles Thread Handling AWT, Swing, JavaFX & SWT 3
H Swing JfreeChart aktualisieren - mit daten aus thread AWT, Swing, JavaFX & SWT 3
T Java Swing Main GUI Thread AWT, Swing, JavaFX & SWT 3
C Event Handling Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException AWT, Swing, JavaFX & SWT 43
T Table-Zeilen mit Thread einfärben AWT, Swing, JavaFX & SWT 15
F Swing GUI-Thread für automatisches Update nutzen AWT, Swing, JavaFX & SWT 10
Y KeyListener, GUI Thread, repaint AWT, Swing, JavaFX & SWT 7
V Nullpointerexception (etwas mit thread und jframe) AWT, Swing, JavaFX & SWT 3
P Problem Thread.sleep() und JProgressBar AWT, Swing, JavaFX & SWT 7
S SWT GUI-Thread AWT, Swing, JavaFX & SWT 11
A Thread und sleep(1000); AWT, Swing, JavaFX & SWT 7
B Swing Thread+Animation AWT, Swing, JavaFX & SWT 7
S Timer oder Thread.sleep AWT, Swing, JavaFX & SWT 3
M Exception in thread "Thread-3" java.lang.NullPointerException AWT, Swing, JavaFX & SWT 18
B Über SWT Button Thread beenden AWT, Swing, JavaFX & SWT 2
C SWT Gui Thread hängt sich auf AWT, Swing, JavaFX & SWT 3
lumo SWT Exception in thread "main" org.eclipse.swt.SWTError: No more handles AWT, Swing, JavaFX & SWT 3
Luk10 Swing Problem mit Zeichen-Thread AWT, Swing, JavaFX & SWT 8
G 2D-Grafik Von Thread aus Zeichnen AWT, Swing, JavaFX & SWT 5
U Swing JLabel bewegen mittels Thread AWT, Swing, JavaFX & SWT 3
M JProgressBar für einen Thread AWT, Swing, JavaFX & SWT 14
R JTable und Thread AWT, Swing, JavaFX & SWT 4
K Thread.sleep in GUI AWT, Swing, JavaFX & SWT 4
J Thread funktioniert nicht AWT, Swing, JavaFX & SWT 10
D JPanel mit Thread in JPanel AWT, Swing, JavaFX & SWT 4
F Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: null AWT, Swing, JavaFX & SWT 5
P Teil einer Swing GUI in eigenem Thread AWT, Swing, JavaFX & SWT 4
S Thread.sleep() in einer methode fürs zeichen AWT, Swing, JavaFX & SWT 3
O JTree/TreeModel/DefaultMutableTreeNodes thread safe machen AWT, Swing, JavaFX & SWT 3
P repaint während Thread läuft AWT, Swing, JavaFX & SWT 9
F SWT table refresh per Thread AWT, Swing, JavaFX & SWT 2
V Swing remove(Component) blockiert Thread sehr lange. AWT, Swing, JavaFX & SWT 6
J AWT Artefakte bei AWT-Rendering durch parallelen Thread AWT, Swing, JavaFX & SWT 4
H Thread-Problem mit der Darstellung beim Sperren des Fensters AWT, Swing, JavaFX & SWT 2
T Event Dispatch Thread und noch ein Thread AWT, Swing, JavaFX & SWT 7
Burny91 Swing Thread mit wait() und notify() steuern AWT, Swing, JavaFX & SWT 22
N SWT - über Thread Composite erstellen und Anhängen AWT, Swing, JavaFX & SWT 6
K Vom Gui aus auf einen Thread warten AWT, Swing, JavaFX & SWT 4
X Problem bei JTextArea und Thread.sleep() AWT, Swing, JavaFX & SWT 8
F Merkwürdiges Verhalten zeichnen sperater Thread AWT, Swing, JavaFX & SWT 13
B Swing Swing und Thread.sleep() AWT, Swing, JavaFX & SWT 6
N Exception Behandlung mit setDefaultUncaughtExceptionHandler, insbesondere im EventDispatcher Thread AWT, Swing, JavaFX & SWT 4
Q Neuer Thread zum Öffnen AWT, Swing, JavaFX & SWT 2
P Swing GUI im Thread? AWT, Swing, JavaFX & SWT 5
T GUI JFrame - neuer Thread AWT, Swing, JavaFX & SWT 2
data89 Was mache ich mit "Dispatched Event Thread"/Substance falsch? AWT, Swing, JavaFX & SWT 4
0x7F800000 Allg. Frage zum ev. dispatch thread, wie korrekt auf reaktion der Listener warten? AWT, Swing, JavaFX & SWT 4
S Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException AWT, Swing, JavaFX & SWT 7
T thread.sleep Sprung Problem AWT, Swing, JavaFX & SWT 24
N Server mit Thread und Statusbox AWT, Swing, JavaFX & SWT 3
S Objektverhalten in einen Thread legen AWT, Swing, JavaFX & SWT 4
G JProgressBar actionPerformedMethode und SwingUI thread AWT, Swing, JavaFX & SWT 36
E Komponenten in Event Dispatch Thread erzeugen? AWT, Swing, JavaFX & SWT 4
J Thread in GUI einbauen AWT, Swing, JavaFX & SWT 2
Lony AbstractTableModel Exception in thread "AWT-EventQueue- AWT, Swing, JavaFX & SWT 3
A Ticker als Thread AWT, Swing, JavaFX & SWT 3
G Auf Ergebnis vom Thread warten AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben