JavaFX SplitPane Anwendung - Controller Probleme

gottfried

Mitglied
Hallo
ich bin dabei mit Netbeans 8.1 und SceneBuilder 8.5.0 unter Linux eine erste JavaFX Anwendung zu erstellen.
Grundlage ist eine SplitPane mit einer VBox controlPane und einer VBox dataPane. Startcode:
Java:
public class SampleFX extends Application {
    @Override
    public void start(Stage primaryStage) throws IOException {
        SplitPane mainPane = (SplitPane) FXMLLoader.load(getClass().getResource("/samplefx/view/main.fxml"));
        Scene scene = new Scene(mainPane);
        primaryStage.setTitle("JavaFX DLDB Application");
        primaryStage.setScene(scene);
        primaryStage.setMaximized(true);
        primaryStage.show();
    }
    public static void main(String[] args) {
        launch(args);
    }


Mit den Buttons in der schmalen controlPane links werden fxml-Files in den Arbeitsbereich, die dataPane geladen.
Das geschieht mit folgendem Code:
Java:
public void setDataPane(Node node) {
        dataPane.getChildren().setAll(node);
    }

public void openIntern(ActionEvent event) throws IOException {
        setDataPane("/samplefx/view/FXML1.fxml");
    }


In FXML1 werden Kunden geladen, ausgewählt und dann soll ein in der Tabelle enthaltener Vorgang in FXML2 geöffnet
werden. Dazu werden zunächst KNR und VNR in der Datenbank zwischengespeichert:
Java:
public void saveInDB() {
        TablePosition pos = TableVorgang.getSelectionModel().getSelectedCells().get(0);
        int row = pos.getRow();
        String vnr = TableVorgang.getColumns().get(0).getCellObservableValue(row).getValue().toString();
        String sknr = res.getText();
        Connection conn = null;
        try {
            Class.forName("org.postgresql.Driver");
            conn = DriverManager.getConnection(jhpn, uname, pw);
            String sSQL = "UPDATE print SET knr = " + "'" + sknr + "'," + "vnr = " + "'" + vnr + "'" + "WHERE print.pid = 1 ";
            Statement st = conn.createStatement();
            st.execute(sSQL);

        } catch (ClassNotFoundException | SQLException e) {
            JOptionPane.showMessageDialog(null, "Fehler in SaveInDB(): " + e); //muss noch durch Alert ersetzt werden
        }


Das funktioniert. Nun muss ich einen Weg finden, um die Methode im FXML2 Controller aufzurufen, die die Daten unter
Verwendung der gesicherten KNR und VNR ins FXML2 dataPane lädt. Eine Möglichkeit wäre es, den Methodenaufruf hier anzuhängen:
Java:
public void openIntern(ActionEvent event) throws IOException {
        setDataPane("/samplefx/view/FXML2.fxml");
        ...load Daten aus der DB ???
    }


Dazu müsste jedoch vom Controller von FXML1 aus eine Methode des Contrlollers von FXML2 aufgerufen werden. Bei der Suche nach
einer Lösung habe ich https://stackoverflow.com/questions/14187963/passing-parameters-javafx-fxml gefunden, leider
sind dort sehr viele Wege aufgeführt und ich weiß nicht, ob der für meine Konstellation richtige dabei ist.

Noch besser fände ich, wenn man an das Laden von FXML2 mittels eines Focus-Listeners den Methodenaufruf binden
und so die Daten automatisch laden könnte. Ich hoffe, hier wieder Hilfe zu finden.
 
Kannst du mal konkret die Methoden posten, die du aufgerufen haben willst? Also welche Methode von welcher aufgerufen wird?
 
@Hatsi09
also, DataPane ist die zweite, leere VBox in der SplitPane. Im MainController.java stehen die Methoden, um die FXML Files in die DataPane zu laden. Zum Beispiel
Java:
public void kundenTSR(ActionEvent event) throws IOException {
        setDataPane(fadeAnimate("/samplefx/view/FXML1.fxml"));
}
Dort werden (im Moment per Button) Daten in eine ComboBox geladen. Das soll möglichst sofort mit dem Laden der FXML1.fxml
passieren. Die Methode dazu:
Java:
 final ObservableList options = FXCollections.observableArrayList();
    ...
@FXML
    private void fillCombo(ActionEvent event) {
        Connection conn = null;
        try {
            Class.forName("org.postgresql.Driver");
            conn = DriverManager.getConnection(jhpn, uname, pw);

            String sSQL = "SELECT kunden.bem FROM kunden ORDER BY kunden.bem ASC";
            Statement st = conn.createStatement();
            ResultSet rs = st.executeQuery(sSQL);
            while (rs.next()) {
                options.add(rs.getString(1));
            }
            ComboBoxKunden.setItems(options);
            ComboBoxKunden.requestFocus();
            conn.close();

        } catch (ClassNotFoundException | SQLException e) {
            JOptionPane.showMessageDialog(null, "Fehler in fillCombo(): " + e);
        }
    }
Mein letzter Stand ist, dass der Focus nach dem Laden von FXML1 im Feld start ist (Cursor) und ich versuche mit
Java:
start.focusedProperty().addListener((ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) -> {
            focusState(newValue);
        });
einen Listener einzufügen, um den Focuserhalt des Feldes zu nutzen, weiß aber nicht so recht, wie man das auswertet, um eine Methode auszuführen. Ist das überhaupt so lösbar?
 
Zudem ersten Punkt: Wenn die Daten der Combobox mit der FXML1 geladen werden sollen, warum machst du das dann mit dem Button und nicht gleich in der initialize des Controllers von FXML1?
Was genau meinst du mit Feld start, ist das die Combobox, deren Inhalt du lesen willst oder ist das ein Array?
 
hallo
ich habe schon relativ viel mit JavaSwing gemacht, mit FX beginne ich erst. Gestern ist das von mir bestellte JavaFX-Buch
eingetroffen und wenn ich wieder mehr Zeit habe werde ich mich da rein vertiefen und dann versuchen, dem Hinweis
von Hatsi09 zu folgen, es in der initialize des Controllers von FXML1 zu machen. Das mit dem Button war eh nur zum
Test der oben zitierten Methode gedacht. Erstmal Danke, ich melde mich wieder.
 

Zurück
Oben