Как я могу изменить активное окно моего приложения, когда я слушаю последовательный порт? - PullRequest
0 голосов
/ 26 февраля 2020

Я создаю приложение на JavaFX, которое состоит из нескольких windows. Все в порядке, когда я хочу изменить главное окно с событием щелчка.

Но теперь я хочу изменить окно, когда я получаю специальную инструкцию по последовательному порту.

Я использовал jSerialComm и я могу прочитать все инструкции с помощью addDataListener, но когда я вызываю функцию для изменения главного окна, ничего не происходит.

Вот мой слушатель:

public class MainOverviewController {
    @FXML
    private Text zonenom;

[...]

    // Reference to the main application.
   private MainApp mainApp;
    /**
     * Is called by the main application to give a reference back to itself.
     *
     * @param mainApp
     */
    public void setMainApp(MainApp mainApp) {
        this.mainApp = mainApp;
        mainApp.getPortCom().addDataListener(new SerialPortDataListener() {
               @Override
               public int getListeningEvents() {

                   return SerialPort.LISTENING_EVENT_DATA_RECEIVED; }
               @Override
           public void serialEvent(SerialPortEvent event)
           {
              String trame = "";
              char tmp;
              byte[] newData =  event.getReceivedData();
              System.out.println("Received data of size: " + newData.length);
              for (int i = 0; i < newData.length; ++i){
                  tmp = (char)newData[i];
                  trame = trame + Character.toString(tmp);
              }
              trame = trame.trim();
              String type = trame.substring(0,3);
              System.out.println("type=*" + type + "*");
              if(type.equals("_BA")){
                showMainOverview(2);
              }else{
              System.out.println(type);
              }
           }
        });
    }

Функция, которую я вызываю в моем слушателе is:

public class MainApp extends Application {

    private Stage primaryStage;
    private BorderPane rootLayout;
    private SerialPort comPort;

    /**
     * Constructor
     */
    public MainApp() {
        SerialPort[] ports = SerialPort.getCommPorts();
        for (int i = 0; i < ports.length; i++) {
            System.out.println("PORT " + i + " : " + ports[i].getSystemPortName());
        }
        comPort = SerialPort.getCommPorts()[2];
        comPort.openPort();
        comPort.setBaudRate(115200);
    }

    public SerialPort getPortCom(){
        return comPort;
    }

    [...]

    public void showMainOverview(Integer choixscene) {
      try{
            if(choixscene == 1){
            // Load main overview.
            FXMLLoader loader = new FXMLLoader();
            loader.setLocation(MainApp.class.getResource("view/MainOverview.fxml"));
            AnchorPane mainOverview = (AnchorPane) loader.load();

            // Set main overview into the center of root layout.
            rootLayout.setCenter(mainOverview);

            // Give the controller access to the main app.
            MainOverviewController controller = loader.getController();
            controller.setMainApp(this);
            }else if(choixscene == 2){
                // Load main overview.
                FXMLLoader loader = new FXMLLoader();
                loader.setLocation(MainApp.class.getResource("view/MaintenanceOverview.fxml"));
                AnchorPane mainOverview = (AnchorPane) loader.load();

                // Set main overview into the center of root layout.
                rootLayout.setCenter(mainOverview);

                // Give the controller access to the main app.
                MaintenanceOverviewController controller = loader.getController();
                controller.setMainApp(this);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
   }

Он блокируется в этой строке: rootLayout.setCenter (mainOverview);

У меня нет ошибок, просто ничего не происходит после этой строки.

Если кто-то может объяснить мне, в чем проблема ...

Большое спасибо

...