FX Label text wird nicht richtig angezeigt

zhermann

Mitglied
Wenn ich das Binding für einen einfaches Label richtig verstanden habe, wird bei Änderung des Properties, welches ich an das Label gebunden habe, doch das Label automatisch mit aktualisiert? Warum erscheint dann aber im Label nicht der aktuelle Text?

Hier mal mein Code:
Code:
public class BAGAZLController implements Initializable {


   @FXML AnchorPane content;
   @FXML Label lblStatus;
   
   /*
    * Tabelview definieren aus application.helpers.ImportRecord
    */
   @FXML
   private final TableView<TableRecord> tableData = new TableView<TableRecord>();
   private ObservableList<TableRecord> dataList = FXCollections.observableArrayList();
   
   private ArrayList<File> files;
   private BAGAZL_Helper helper = new BAGAZL_Helper();
   private Object[][] xlsDatas;

   SimpleStringProperty appStatus;

   public BAGAZLController() {
   }

   @Override
   public void initialize(URL location, ResourceBundle resources) {
       createTableData();
       this.setFiles(new ArrayList<File>());

       // Application Status initialisieren und an das Label @FXML lblSatus binden
       appStatus = new SimpleStringProperty();
       lblStatus.textProperty().bind(Bindings.concat("Status: ", appStatus));

       // Initialsatus ausgeben
       appStatus.set("Bereit für Analyse, wählen Sie bitte das Verzeichnis mit den Excel-Files über den Button >Import< aus.");

   }

   @FXML
   public void importXLS() {
       DirectoryChooser dirChooser = new DirectoryChooser();
       File selDirectory = dirChooser.showDialog(null);
       // Verzeichniss einlesen
       ArrayList<File> files = helper.getimpFile(selDirectory);
       if (files == null) return;

       try {
           for (File file : files) {
               
               // Applicationstatus aus geben, dass Datei XYZ.* analysiert wird
               appStatus.setValue("ananlysiere -> " + file.getCanonicalPath().toString());

               this.xlsDatas = new Object[12][4];
               if (!file.getCanonicalPath().toString().contains("Ruf")) {
                   if (!file.getCanonicalPath().toString().contains("$")) {
                       XLS_Helper xlsHelper = new XLS_Helper(file);
                       this.xlsDatas = xlsHelper.getXLSData();
                       if (this.xlsDatas != null) {
                       ..........

Wenn das Programm startet, wird noch korrekt im Label

Status: Bereit für Analyse, wählen Sie bitte das Verzeichnis mit den Excel-Files über den Button >Import< aus.

angezeigt! In der Routine importXLS soll nun per

Code:
               // Applicationstatus aus geben, dass Datei XYZ.* analysiert wird
               appStatus.setValue("ananlysiere -> " + file.getCanonicalPath().toString());

der Status pro Datei geändert werden.
Es bleibt aber der erste Text "Status: Bereit für Analyse, wählen..." stehen, und nach Abschluß der Analyse, zeigt er mir die den Status für die letzte Datei an.

Wenn ich einen Listener, zum Testen, auf lblStatus registriere z.B. so

Code:
       lblStatus.textProperty().addListener(new ChangeListener<String>() {
            @Override
            public void changed(ObservableValue<? extends String> ov, String oldValue, String newValue) {
               System.out.println("Label Text Changed (old: " + oldValue + " new: " + newValue);
            }
        })
wird mir in der Console alles richtig angezeigt.

Hab ich was übersehen/falsch verstanden?
 
Vermutlich blockiert deine Analyse den FX-Thread verhindert damit das updaten.

Deine Analyse sollte in einem extra Thread-laufen
 
Danke für den Tipp. Werde mal die Analyse ausklommentieren, mal sehen ob er es dann macht.
Dann sind wir aber an einem Thema, wo ich mich noch nicht .... 😕🙄😀
Gäbe es eine andere Möglichkeit als zweiter Thread?
 
OK, das verstehe ich.

Also habe mal die Analyse auskommentiert

Code:
       try {
           for (File file : files) {
               
               // Applicationstatus aus geben, dass Datei XYZ.* analysiert wird
               appStatus.setValue("ananlysiere -> " + file.getCanonicalPath().toString());

               this.xlsDatas = new Object[12][4];
               if (!file.getCanonicalPath().toString().contains("Ruf")) {
                   if (!file.getCanonicalPath().toString().contains("$")) {
/*
                       XLS_Helper xlsHelper = new XLS_Helper(file);
                       this.xlsDatas = xlsHelper.getXLSData();
                       if (this.xlsDatas != null) {
                           TableRecord record = new TableRecord(xlsDatas[0][0].toString(), "Vormonat:",

                          ........

                           dataList.addAll(record, record1, record2);
                       }
*/                       
                   }
               }
           }
       } catch (IOException e) {
           e.printStackTrace();
       }

trotzdem macht er es nicht. Jetzt hat er doch eigentlich nix mehr zu tun, als den Status zu aktualisieren?
 
Ja, aber nur für die letzte Datei. Eigentlich sollte er es für jede Datei machen, immer dann wenn er die zu analysierende Datei wechselt. So das der User sieht, welche Datei gerade bearbeitet wird.
 
Vielleicht habe ich auch irgendwas verpasst, aber solange kein separater Thread gestartet wird, wird sich die GUI immer erst nach dem abarbeiten der for schleife aktualisieren.
 
Nicht zu vergessen, dass die GUI im schlimmsten Fall "einschläft" - dann kommt noch diese "Dieses Fenster reagiert nicht mehr"-Meldung (Systemabhängig, schon klar)... Nie auf dem GUI-Thread was machen!
 

Neue Themen


Zurück
Oben