Swing Alter Wert von einer Variable wird verwendet

mathiasj

Bekanntes Mitglied
Hallo,
ich habe eine Variable namens ausgang. Diese Variable wird vo einer Methode überschrieben. Das klappt auch wunderbar, in einem JTextField wird Sie mir richtig angezeigt. Wenn ich die Variable jetzt aber noch einmal überschreibe, wird sie mir bei einer System.out.println() Anweisung richtig angezeigt; im JTextField, ist aber noch der alte Wert! Und das, obwohl ich eine neue Instanz des JTextFields erzeuge...

Java:
JTextField ausField = new JTextField(ausgang, 20);
    System.out.println(ausgang);

Diese Methode wird nochmal aufgerufen; ich bekomme bei .println die richtige, im JTextField die falsche Variable.
 
Natürlich...

Du erzeugst das Textfeld und gibst diesem den initialen Text mit. Wenn nun das Textfeld verändert wird kann die Variable davon ja nix mehr wissen.

Um den "aktuellen" Wert zu bekommen musst du textFeld.getText() verwenden.
 
Hmm. irgendwie habe ich das icht ganz verstanden... Die Methode wird ja, nachdem die Variable geändert wurde, nochmal aufgerufen; -> eine neue Instanz des TextFields mit (eigentlich) dem überschriebenem Wert wird erzeugt?

Aber auch, wenn ich das ganze so mache, habe ich dasselbe Problem:

Java:
JTextField ausField = new JTextField(20);
    ausField.setText(ausgang);
    System.out.println(ausgang + " TextField: " + ausField.getText());
    ausField.setEditable(false);

Ich bekomme in der Eingabeaufforderung: Spieler 1 hat gewonnen TextField: Spieler 1 hat gewonnen

Und im TextField steht etwas falsches...
 
Von dem Code den ich hier sehe, wird dein Textfield nichtmal angezeigt. Poste ein KSKB wo man dein Problem sieht. Mit den 4 Zeilen ist jedenfalls alles in Ordnung.
 
Java:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Test  implements ActionListener {
    JFrame ausFrame = new JFrame("Spiel aus");
String ausgang = null;
int x = 1;

public static void main(String[] args) {
    new Test().los();
}

public void los() {
    

    ausFrame.setSize(500, 100);
    ausFrame.setResizable(false);
    ausFrame.setLocationRelativeTo(null);
    ausFrame.setAlwaysOnTop(true);
    ausFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JPanel ausPanel = new JPanel();
    
    JTextField ausField = new JTextField(20);
    ausField.setText(ausgang);
    System.out.println(ausgang + " TextField: " + ausField.getText());
    ausField.setEditable(false);
    
    JButton ausButton = new JButton("Neues Spiel");
    ausButton.addActionListener(this);

    ausPanel.add(ausField);
    ausPanel.add(ausButton);
    
    ausFrame.add(ausPanel);
    ausFrame.setVisible(true);
  }

public void actionPerformed(ActionEvent e) {
    ausFrame.dispose();
  if(x == 1) {
    ausgang = "Neuer String";
    x++;
  }
  else {
    ausgang ="Allerneuester String";
  }
  los();
}
}

Ich glaube, dass es irgendwie mit dem ausFrame.dispose() zusammenhängt, denn als ich das im Code vergessen habe, hat sich zwar ein neues Fenster geöffnet, doch das JTextField war richtig...
 
Hier hast Du einen grundsätzlichen "Systemfehler". Nur um ein neues Spiel zu starten baut man sich die GUI nicht neu zusammen. Man ändert nur die "Werte" oder setzt diese zurück und zeigt diese in den bereits existierenden GUI Komponenten an.
 
Nein, ich baue die GUI nicht neu auf. Ich will nur ein kleines Fester erstellen, das entweder zeigt Spieler eins hat gewonnen, oder Spieler zwei hat gewonnen. Dieses Fenster soll dann einen Nuestart Button enthalten. Aber mit dem JTextField habe ich ja ein Problem...
 
warum glaubst du dass es das neue Textfeld mit altem String ist?
viel wahrscheinlicher ist doch, dass du noch das alte Textfeld siehst,

du entfernst die alten Komponenten nicht, BorderLayout zeigt immer nur das erste Panel an, weitere eingefügte haben das Nachsehen

> ausFrame.getContentPane().removeAll();
vor dem add() verbessert die Lage,
allgemein ist aber wie schon gesagt wurde dringend davon abzuraten, neue Komponenten zu erzeugen (*),
setze doch einfach im vorhandenen Textfeld den neuen String, schon alles fertig


(*) es ist natürlich möglich, manchmal nötig, aber noch mit mehr Aufwand verbunden für sauberers Vorgehen
 
Zuletzt bearbeitet von einem Moderator:

Neue Themen


Zurück
Oben