2012-04-20 5 views
15

Kürzlich programmierte ich eine Software mit JavaFx2.0, aber ich stieß auf ein großes Problem, nämlich - Wie kann ich auf eine Controller-Klasse zugreifen? Für jede Controller-Klasse mit demselben Klassentyp können sie sich aufgrund des Modells, von dem sie abhängen, anders verhalten, also möchte ich die Controller-Klasse der Ansicht erhalten und sie mit dem angegebenen Modell versehen, kann ich das tun? Ich habe versucht, den Controller durch den FXMLLoader zu bekommen, aber die Methode getController() gibt null zurück!Wie kann ich auf eine Controller-Klasse in JavaFx 2.0 zugreifen?

1.LightView.java

FXMLLoader loader = new FXMLLoader(); 
anchorPane = loader.load(LightView.class.getResource(fxmlFile));//fxmlFile = "LightView.fxml" 
//controller = (LightViewController) loader.getController();//fail to get controller!it is null 
//I want to -> controller.setLight(light); 

2.LightView.fxml

<AnchorPane ... fx:controller="light.LightViewController" > 

3.LightViewController.java

.... 
private Light light; 
public void initialize(URL arg0, ResourceBundle arg1) 

4.Light.java

.... a simple pojo 

Also, was ich tun möchte ist, jeden LightViewController mit einem bestimmten Light-Objekt (sie sind aus einer Liste) zu versorgen. Kann mir jemand helfen? Vielen Dank!

+1

möglich Duplikat [JavaFX 2.0 + FXML. Aktualisieren von Szenenwerten von einer anderen Aufgabe] (http://stackoverflow.com/questions/10107829/javafx-2-0-fxml-updating-scene-values-from-a-different-task) –

+1

Vielleicht könnte diese Antwort hilfreich sein : [http://stackoverflow.com/a/10108788/682495](http://stackoverflow.com/a/10108788/682495). –

Antwort

49

Ich benutze folgendes:

URL location = getClass().getResource("MyController.fxml"); 

FXMLLoader fxmlLoader = new FXMLLoader(); 
fxmlLoader.setLocation(location); 
fxmlLoader.setBuilderFactory(new JavaFXBuilderFactory()); 

Parent root = (Parent) fxmlLoader.load(location.openStream()); 

Auf diese Weise fxmlLoader.getController() nicht null

+0

Vielen Dank! Ihre Methode ist genau das, was ich brauche! Danke, Angain! – yinger090807

+13

@ yinger090807 Sie können [Antworten akzeptieren] (http://meta.stackexchange.com/a/5235/160062), die hilfreich waren (was hier der Fall zu sein scheint) – oers

+0

Ich habe eine Situation, in der 'fxmlLoader.getController() 'hat nicht so funktioniert. Aber ich weiß nicht warum! – cdaiga

5

Neben Alf Antwort, möchte ich bemerken, dass der Code kürzer sein:

URL location = getClass().getResource("MyController.fxml"); 

FXMLLoader fxmlLoader = new FXMLLoader(); 

Parent root = (Parent) fxmlLoader.load(location.openStream()); 

Das funktioniert auch.

0

Verwenden getResourceAsStream statt:

anchorPane = loader.load(LightView.class.getResourceAsStream(fxmlFile)); 

Seine einfache, gut funktionieren.

0

du versuchen ...

FXMLLoader loader = new FXMLLoader(); 
    loader.setLocation(getClass().getResource("LightView.fxml")); 
    loader.load(); 
    Parent parent = loader.getRoot(); 
    Scene Scene = new Scene(parent); 
    Stage Stage = new Stage(); 
    LightViewController lv = loader.getController(); 
    lv.setLight(light); 
    Stage.setScene(Scene); 
    Stage.show(); 
Verwandte Themen