JavaFX Sprachumschaltung mit Button auf der HMI

Bang_Markus

Mitglied
Hallo,
ich habe mir eine Visualisierung erstellt mit 3 Flaggen (Button mit Image) für die Sprachumschaltung.
Die Umschaltung erfolgt (Lese in der Konsole welche gesetzt wurde) nur die Variable bzw. der Text wird nicht umgeschaltet.
Wenn ich die Sprache in der Start funktion statisch ändere funktioniert es, nur leider danach über die Buttons nicht.
Muss hierfür die ganze Seite nach Umschaltung neu geladen werden?

LG.
Markus
 
Ich weis nicht was du mit Seite meinst.

Javafx hat die language packages

oder du baust dir mit String Bindings ein eigenes Sprach System
 
Folgendes Programmbeispiel, wo könnte der Fehler stecken?

So sieht meine Main Klasse aus:
Java:
package lagerverwaltung;

import java.util.Locale;
import java.util.ResourceBundle;

import javafx.application.Application;
import javafx.application.Platform;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;
import javafx.stage.WindowEvent;
import lagerverwaltung.hmi.Language;

public class LagerverwaltungsApp extends Application{
    
     //private static OPCUAWorker opcuaWorker;
    
    
     @FXML BorderPane borderPane;
     private String language = "de";       
    
    
     @Override
     public void start(Stage mainStage) throws Exception {
        
         Language test = new Language();       
         test.languageProperty().addListener(new ChangeListener<Object>() {
            @Override
            public void changed(ObservableValue<?> o, Object oldVal, Object newVal) {
               language = test.getLanguage();
               System.out.println(language);               
            }
        });
        
         System.out.println(language); 
        
         Locale locale = new Locale(language);
         ResourceBundle bundle = ResourceBundle.getBundle("lagerverwaltung.resources.LagerApp", locale);       
                  
         Parent root = FXMLLoader.load(getClass().getResource("/lagerverwaltung/hmi/LagerApp.fxml"), bundle);
         Scene scene = new Scene(root, 1920, 600);
         mainStage.setScene(scene);
     //borderPane.setCenter(FXMLLoader.load(getClass().getResource("/lagerverwaltung/hmi/Home.fxml")));
         mainStage.show();
        
         mainStage.setOnCloseRequest(new EventHandler<WindowEvent>() {
            @Override
            public void handle(WindowEvent windowEvent) {
                close();               
            }
         });
        
     }
      
    
    
    
     // on close
     public static void close() {               
//        opcuaWorker.stop();
         Platform.exit();
         }
    
     public static void main(String[] args) {
//        opcuaWorker = new OPCUAWorker();
//        Thread t = new Thread(opcuaWorker); // create thread
//        t.start();  // start thread
    
         LagerverwaltungsApp.launch(args);
}
}

So sieht die Klasse Controller aus:
Code:
Klasse Controller

package lagerverwaltung.hmi;

import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;

import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.control.Label;
import javafx.scene.layout.BorderPane;
import lagerverwaltung.LagerverwaltungsApp;

public class LagerverwaltungsApp_Controller implements Initializable{
    
     Language language2 = new Language();
    
     @FXML BorderPane borderPane;
    
     @FXML private Label lbl_krannummer;   
    
     ResourceBundle bundle;

     @Override
     public void initialize(URL location, ResourceBundle resources) {     
        
         try {
         borderPane.setCenter(FXMLLoader.load(getClass().getResource("/lagerverwaltung/hmi/Home.fxml")));
         } catch (IOException e) {
              System.out.println(e.getMessage());
         };
        
     }
    
     @FXML void btn_Home(ActionEvent event) throws IOException{
     borderPane.setCenter(FXMLLoader.load(getClass().getResource("/lagerverwaltung/hmi/Home.fxml")));;
     }
    
    
     @FXML void btn_Lagerübersicht(ActionEvent event) throws IOException{
         borderPane.setCenter(FXMLLoader.load(getClass().getResource("/lagerverwaltung/hmi/Bild_test.fxml")));
     }   
    
     @FXML protected void exit() {
         LagerverwaltungsApp.close();
     }
    
    
     // Sprachumschaltung
     @FXML protected void setLanguage_de() {         
         language2.setLanguage("de");
     }   
     @FXML protected void setLanguage_en() {     
         language2.setLanguage("en");
     }   
     @FXML protected void setLanguage_tr() {
         language2.setLanguage("tr");

    }   
}

So sieht meine Klasse Language aus:
Java:
package lagerverwaltung.hmi;

import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;

public class Language {
    
     private StringProperty language;
    
     public final String getLanguage() {
         if (language != null) {
              System.out.println("getLanguage wurde aufgerufen!" + language);
              return language.get();           
         }         
         return "de";
         }

     public final void setLanguage(String newLanguage) {
         System.out.println("setLanguage wurde aufgerufen!");
         this.languageProperty().set(newLanguage);
         }

     public final StringProperty languageProperty() {
         System.out.println("languageProperty wurde aufgerufen!");
         if (language == null) {
              language = new SimpleStringProperty("de");
              }
         return language;
     }
    
}
 
ok du setzt irgendwas mit deinen buttons.. und dann? dann hast eine String property da... und machst nix damit
 
Außerdem musst du in javafx mit Tasks und Services von Javafx arbeiten und nicht mit tasks weil es sein kann dass der Thread javafx abschießt... Javafx ist nicht thread sicher , aber tasks und services funktionieren das sind irgendwelche spezial threads
 
Ja das ist das objekt mit dem Namen Test. das ist auch das was du benutzt.

dieses Objekt ist aber den Buttons nicht bekannt. die Buttons benutzen
Language language2 = new Language();
in dem Controller, diese language2 wird nie benutzt aktiv

du setzt zwar die Werte davon aber die neue Sprache wird nie irgenddwo hergenommen.
du hast 2 Language Objekte
 

Zurück
Oben