2014-01-19 10 views
7

Ich verwende SceneBuilder in Verbindung mit Netbeans JavaFX-Bibliothek für dieses Projekt. Ich benutze Scenebuilder, um die fxml und netbeans für die Controller-Klassen zu erstellen. Ziel ist es, eine ziemlich komplexe App zu erstellen, die bereitgestellt werden soll.Mit einer laufenden JavaFX-Anwendung, öffnen Sie ein neues Fenster mit einer eigenen, separaten Controller-Klasse

Ich kann eine JavaFX-Anwendung starten und die Controller-Klasse gut anschließen. Wenn ich jedoch versuche, ein neues Fenster zu öffnen, kann ich anscheinend keine Controller-Klasse an das neue Fenster binden. Um die Dinge einfach zu halten, möchte ich aufgrund eines komplexen Backends eine separate Controller-Klasse für das neue Fenster haben.

TL; DR - Es wird versucht, ein neues Fenster für die JavaFX-Anwendung mit einer Controller-Klasse zu öffnen. Controller-Klasse ist nicht bindend.

Codebeispiele unten

Modellklasse - Wrapper für die Anwendung startet

public class Model extends Application{ 
    public static void main(String[] args){ 
     Application.launch(Model.class, args); 
    } 
    @Override 
    public void start(Stage stage) throws Exception{ 
     Parent root = FXMLLoader.load(getClass().getResource("Sample.fxml")); 
     stage.setScene(new Scene(root)); 
     stage.show(); 
    } 
} 

Sample.fxml - fxml Datei für die Hauptanwendung

Sample.java - erstreckt initialisierbare , ist die Controller-Klasse für Sample.fxml. Im Folgenden finden Sie Codeausschnitt, wo ich versuche, das neue Fenster „ServerConfigChooser

try{ 
    Parent root = FXMLLoader.load(getClass().getResource("ServerConfigChooser.fxml")); 
    FXMLLoader loader = new FXMLLoader(getClass().getResource("ServerConfigChooser.fxml")); 
    ServerConfigChooser controller = new ServerConfigChooser(); 

    loader.setController(controller); 
    loader.setRoot(root); 

    Stage stage = new Stage(); 
    stage.setScene(new Scene(root)); 
    stage.show(); 
} catch (IOException ex) 

ServerConfigChooser.java Titel zu öffnen - implementiert initialisierbare

Dies ist, wo ich die Probleme habe ich Variablen mit dem gleichen fxid nicht einfach erklären kann. Die Methode initialize() wird nicht ausgelöst, wenn die Klasse aufgerufen wird

Der Grund für den Konstruktor in der ServerConfigChooser-Klasse ist, dass ich die initialize() -Methode nicht automatisch auslösen konnte feuern Sie das manuell innerhalb des Konstruktors

Alle Lösungen sind willkommen!

+0

JavaFX für jetzt zu tun hat. Hoffentlich werden die Speicherlecks in naher Zukunft behoben werden – Kyte

+3

Ein Wort zu den Weisen. Das Senden von Fragen an Sonntagen ist für SO die am wenigsten aktive Zeit der Woche. Warte auf Montag für bessere Ergebnisse – jth41

+0

Ich stimme mit jth41 überein – nate

Antwort

8

Laden Sie die FXML nicht zweimal so. Sie können mehrmals das gleiche .fxml Dokument laden (mehrere Szenen Graph/Controller), aber wenn Sie zusammen das Szenen Graph laden und den Controller initialisieren möchten, müssen Sie den fxml loader nur einmal aufrufen.

Hier ist ein Beispiel

FXMLLoader loader = new FXMLLoader(getClass().getResource("ServerConfigChooser.fxml")); 
    ServerConfigChooser controller = new ServerConfigChooser(); 
    loader.setController(controller); 
    loader.setRoot(controller); 
    Parent root; 
    try { 
     root = (Parent) loader.load(); 
     Scene scene = new Scene(root, 320, 200); 
     Stage stage = new Stage(); 
     stage.setScene(scene); 
     stage.show(); 
    } catch (IOException ex) { 
     Logger.getLogger(ServerConfigChooser.class.getName()).log(Level.SEVERE, null, ex); 
    } 

Beachten Sie, dass

  • dem Controller sollte den Knotentyp des Root-Knotens Ihres .fxml Dokument
  • Ihre erweitern.fxml-Dokument sollte fxroot-Konstrukt verwenden, siehe this doc (Sie können dies im Szenen-Builder festlegen)
  • Sie sollten den Controller aus dem fxml-Wurzelelement entfernen. Es wird mit dieser Art und Weise in Konflikt

Zum Beispiel der Controller-Klasse

public class ServerConfigChooser extends AnchorPane implements Initializable { 
    ... 
} 

die FXMLLoader Klasse der Verwendung und die .fxml

<fx:root type="javafx.scene.layout.AnchorPane" id="AnchorPane" prefHeight="200.0" prefWidth="320.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2">

2

Das Problem hier ist wahrscheinlich, wie Sie die ServerConfigChooser laden (ich habe das Gefühl, dass die FXML doppelt oder so ähnlich geladen ist). Folgendes sollte funktionieren:

try { 
    FXMLLoader loader = new FXMLLoader(getClass().getResource("ServerConfigChooser.fxml")); 
    ServerConfigChooser controller = new ServerConfigChooser(); 
    loader.setController(controller); 
    Parent root = (Parent) loader.load(); 

    Stage stage = new Stage(); 
    stage.setScene(new Scene(root)); 
    stage.show(); 
} 
catch(...) {...} 

Prüfen Sie auch, dass Sie nicht angeben fx:controller in ServerConfigChooser.fxml (könnte in Konflikt stehen, haben nicht wirklich versucht).

Verwandte Themen