JavaFX Serialport schliessen

ffghts

Mitglied
Hallo, ich bin noch recht neu in der JavaFX Welt. Und bin nun auf ein Problem gestossen, dass ich einfach nicht lösen kann.

In meinem Programm öffne ich einen Seriellen Port, um mit dem Arduino kommunizieren zu können. Das ganze mache ich mit der jssc Lib. Soweit funktioniert auch alles ohne Probleme.

Jetzt will ich aber, dass der Port wieder geschlossen wird, wenn ich die Stage über das Kreuz oben rechts schliesse. Das wollte ich über die stop() Methode in der Main Klasse machen. Habe also eine Instanz von meiner Controller Klasse in der stop() Methode angelegt. Worauf ich immer eine NullPointException bekomme, wenn ich die Stage schliesse.

Gibt es irgendeine Möglichkeit, den Port in meiner Controller Klasse zu schliessen, wenn die Stage geschlossen wird?

Main Klasse:
Java:
public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception{

        Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
        primaryStage.setTitle("Test App");
        primaryStage.setScene(new Scene(root, 1500, 700));
        primaryStage.show();
    }

    @Override
    public void stop() {

    }

    public static void main(String[] args) {
        launch(args);
    }
}

Ausschnitt Controller Klasse:
Java:
public SerialPort serialPort;

private boolean portOpen = false;

private SerialPortHandler serialPortHandler;
private SerialPortReader serialPortReader;

public void btnConnect() {

        int baudRate = 0;

        if (baudCombo.getValue() != null && portCombo.getValue() != null) {

            System.out.println("BaudCombo: " + baudCombo.getValue());
            System.out.println("Port: " + portCombo.getValue());

            try {

                if (!portOpen) {

                    serialPort = new SerialPort(portCombo.getValue());

                    switch (baudCombo.getValue()) {
                        case "300":
                            baudRate = SerialPort.BAUDRATE_300;
                            break;
                        case "1200":
                            baudRate = SerialPort.BAUDRATE_1200;
                            break;
                        case "4800":
                            baudRate = SerialPort.BAUDRATE_4800;
                            break;
                        case "9600":
                            baudRate = SerialPort.BAUDRATE_9600;
                            break;
                        default:
                            System.out.print("Lass hier nochmal ein Error Fenster anzeigen");
                            break;
                    }

                    portOpen = true;
                    serialPortHandler = new SerialPortHandler(serialPort, baudRate);

                } else {

                    Alert alert = new Alert(Alert.AlertType.ERROR);
                    alert.setTitle("Fehler");
                    alert.setHeaderText(null);
                    alert.setContentText("Port ist bereits geöffnet!");

                    alert.showAndWait();
                }

                if(serialPort.isOpened()) {
                    lblConnection.setText("Verbunden");
                }

            } catch (Exception ex) {

                System.out.println(ex);
            }

        } else {

            Alert alert = new Alert(Alert.AlertType.ERROR);
            alert.setTitle("Fehler");
            alert.setHeaderText(null);
            alert.setContentText("Es muss ein Port und eine Baudrate gewählt werden!");

            alert.showAndWait();
        }
    }


SerialPortHandler Klasse:
Java:
public class SerialPortHandler {

    private SerialPort serialPort;

    private SerialPortReader serialPortReader;

    private String readData = "";
    private int baudRate;

    public SerialPortHandler(final SerialPort serialPort, final int baudRate) {
        this.serialPort = serialPort;
        this.baudRate = baudRate;

        portHandler();
    }

    private void portHandler() {

        serialPortReader = new SerialPortReader(serialPort);

        try {

            serialPort.openPort();
            serialPort.setParams(baudRate, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);

            serialPort.addEventListener(serialPortReader);

        } catch (SerialPortException ex) {
            System.err.print(ex);
        }
    }

    public SerialPortReader readedData() {
        return serialPortReader;
    }
}
 

knilch

Bekanntes Mitglied
Hi,
Hier eine Variante wie du das umsetzten könntest:
Dazu brauchst du in der Controller-Klasse zusätzliche eine public und eine private Methode:
Java:
public void setStage(Stage primaryStage) {
   this.primaryStage = primaryStage;
   // if the user click the close-button on primaryStage, do some check before window is closed.
   primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() {
      @Override
      public void handle(WindowEvent event) {
         // we must consume the event,
         // if we don't do this and the user click canncel in the dialog from closeApp than the app exit..
         event.consume();
         closeApp();
      }
   });
}
...
private void closeApp() {
   // Mach hier noch etwas bevor das Gui geschlossen wird.
   // Dann als letzter Aufruf:
   Platform.exit();
}
...
In der Controller-Klasse wird dann in der Methode closeApp() der Code ausgeführt, sobald auf das rote X vom Gui oben rechts gedrückt wird.

In der start-Methode:
Java:
final FXMLLoader loader = new FXMLLoader(getClass().getResource("MainGui.fxml"));
final Parent root = (Parent) loader.load();
MainGuiController mainGuiController = (MainGuiController)loader.getController();
mainGuiController.setStage(primaryStage);
primaryStage.setTitle(Constants.TITLE + " V" + Constants.VERSION);
ps.
Damit hast du auch eine Möglichkeit, zu verhindern dass das Fenster geschlossen wird, wenn im Hintgerund noch eine Arbeit läuft, die beendet werden muss.
Das geht dann so:
Java:
boolean workInProrgress;
workInProrgress setzt du auf true, sobald die länger dauernde Arbeit gestartet wird. Sobald die Arbeit fertig ist, workInProrgress = false;
In
Java:
private void closeApp() {
   if(workInProrgress)
      return;
   else {
      // Mach hier noch etwas bevor das Gui geschlossen wird.
      // Dann als letzter Aufruf:
      Platform.exit();
   }
}
...
 
Zuletzt bearbeitet:

ffghts

Mitglied
Hi,
ich konnte es mit dank deiner vorgeschlagenen Variante lösen. :D

Ich danke dir vielmals und wünsche Dir einen guten Rutsch ins neue Jahr. :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
MiMa JavaFX Fenster in JavaFX öffnen Schliessen (Initialisierung) AWT, Swing, JavaFX & SWT 20
MiMa Schliessen eines FXML Fensters? AWT, Swing, JavaFX & SWT 10
T Anwendung mit X schliessen AWT, Swing, JavaFX & SWT 1
S mit keylistener frame schliessen AWT, Swing, JavaFX & SWT 8
F Swing Auf Knopfdruck ein Fenster schliessen AWT, Swing, JavaFX & SWT 12
D Aktuelles Fenster schliessen AWT, Swing, JavaFX & SWT 12
N Ereignis beim Schliessen eines Dialoges AWT, Swing, JavaFX & SWT 4
F getrennte formulare schliessen gleichzeitig AWT, Swing, JavaFX & SWT 7
V Alle offenen jDialoge schliessen AWT, Swing, JavaFX & SWT 3
K frame schliessen AWT, Swing, JavaFX & SWT 7
F JDialog per Button schliessen - klappt nicht AWT, Swing, JavaFX & SWT 4
R Fenster schliessen AWT, Swing, JavaFX & SWT 8
S Swing Fenster schliessen, javaw noch im Speicher AWT, Swing, JavaFX & SWT 5
P JTree Knoten schliessen AWT, Swing, JavaFX & SWT 16
S JDialog gibt keine Nachrichten ueber sein Schliessen..? AWT, Swing, JavaFX & SWT 3
S Iphone Style Schliessen AWT, Swing, JavaFX & SWT 3
V JTable verliert Fokus, wie offene Zelle schliessen? AWT, Swing, JavaFX & SWT 5
H Netbeans-Anwendung schliessen AWT, Swing, JavaFX & SWT 8
F Fenster schliessen AWT, Swing, JavaFX & SWT 17
J WindowEvents beim Schliessen eines Fensters AWT, Swing, JavaFX & SWT 5
W Beim Schliessen Aktion ausführen AWT, Swing, JavaFX & SWT 2
D 2 verschiedene Frames mit einem Button schliessen AWT, Swing, JavaFX & SWT 2
P Mit Cancel Button ein JPanel schliessen AWT, Swing, JavaFX & SWT 12
K Automatisches schliessen eines Dialogs AWT, Swing, JavaFX & SWT 4
A JFrame: Abfrage ob schliessen oder nicht? AWT, Swing, JavaFX & SWT 8
K Automatisch einen Dialog schliessen AWT, Swing, JavaFX & SWT 15
E JDialog auf Knopfdruck schliessen AWT, Swing, JavaFX & SWT 2
E Will nur fenster schliessen AWT, Swing, JavaFX & SWT 2
S JDialog schliessen und es mitbekommen AWT, Swing, JavaFX & SWT 5
U Anwendung nicht beenden beim form schliessen? AWT, Swing, JavaFX & SWT 6
G JDialog schliessen AWT, Swing, JavaFX & SWT 5
S JDialog und 'Inhalte' schliessen bzw. leeren AWT, Swing, JavaFX & SWT 9
Y Problem mit JFrame und Panel (Schliessen eines JFrame) AWT, Swing, JavaFX & SWT 8
B MouseListener & Fenster schliessen AWT, Swing, JavaFX & SWT 3
lin modaler JDialog mit #dispose() schliessen ? AWT, Swing, JavaFX & SWT 4
D JDialog muss man immer öfters schliessen AWT, Swing, JavaFX & SWT 3
L JWindow schliessen AWT, Swing, JavaFX & SWT 4
M JFrame über x schliessen überschreiben funktioniert nicht! AWT, Swing, JavaFX & SWT 7
R Eingabeaufforderungs-Fenster beim start schliessen - wie? AWT, Swing, JavaFX & SWT 6
G JDialog schliessen deaktivieren AWT, Swing, JavaFX & SWT 7
D JFrame Fenster schliessen, zerstören . AWT, Swing, JavaFX & SWT 4
F JFrame über Button schliessen AWT, Swing, JavaFX & SWT 10
G Fenster ohne "verkleinern","Schliessen", AWT, Swing, JavaFX & SWT 4
M frame lässt sich nicht schliessen AWT, Swing, JavaFX & SWT 7
L Fenster Schliessen AWT, Swing, JavaFX & SWT 8
bernd Fenster ohne x zum schliessen anzeigen! AWT, Swing, JavaFX & SWT 14
G Aktion beim Öffnen und Schliessen eines JInternalFrames AWT, Swing, JavaFX & SWT 4
B JFrame schliessen? AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben