2012-04-20 13 views
15

Recientemente estaba programando un software con JavaFx2.0, pero me encontré con un gran problema, es decir, ¿cómo puedo acceder a una clase de controlador? Para cada clase de controlador con el mismo tipo de clase, pueden actuar de forma diferente debido al modelo del que depende, por lo que quiero obtener la clase Controlador de la vista y proporcionarle el modelo especificado, ¿puedo hacer esto? He intentado obtener el controlador mediante el FXMLLoader, pero el método getController() devuelve nulo. ¿Por qué?¿Cómo puedo acceder a una clase de controlador en JavaFx 2.0?

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 

así que, lo que quiero hacer es proporcionar a cada LightViewController un Objeto de luz específico (son de una Lista). ¿Alguien me puede ayudar? ¡Muchas gracias!

+1

posible duplicado de [JavaFX 2.0 + FXML. Actualización de valores de escena de una Tarea diferente] (http://stackoverflow.com/questions/10107829/javafx-2-0-fxml-updating-scene-values-from-a-different-task) –

+1

Quizás esta respuesta pueda ser útil : [http://stackoverflow.com/a/10108788/682495](http://stackoverflow.com/a/10108788/682495). –

Respuesta

49

uso el siguiente:

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

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

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

De esta manera fxmlLoader.getController() no es null

+0

¡Muchas gracias! ¡Su método es todo lo que necesito! ¡Gracias de nuevo! – yinger090807

+13

@ yinger090807 Puede [aceptar respuestas] (http://meta.stackexchange.com/a/5235/160062) que fueron útiles (lo que parece ser el caso aquí) – oers

+0

Tengo una situación en la que 'fxmlLoader.getController() 'no funcionó de esa manera. ¡Pero no sé por qué! – cdaiga

5

Además de la respuesta de Alf, quiero señalar, que el código puede ser más corto:

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

FXMLLoader fxmlLoader = new FXMLLoader(); 

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

Esto también funciona.

0

Uso getResourceAsStream lugar:

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

Su simple, funcionan bien.

0

Puede probar este ...

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(); 
Cuestiones relacionadas