2012-04-13 15 views
8

Considerando el siguiente ejemplo.Javafx 2.0 How-to Application.getParameters() en un archivo Controller.java

¿Cómo acceder a los argumentos/parámetros de la aplicación en el controlador?

Gracias.


NB: He intentado mezclar App.java y MyController.java en un solo archivo de clase, pero no ayudó.


App.java (simplificado):

public class App extends Application { 

    public static void main(String[] args) { 
     Application.launch(App.class, args); 
    } 

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

     // output arguments in console 
     System.out.println(getParameters().getNamed().toString()); 

     Parent root = FXMLLoader.load(getClass().getResource("MyView.fxml")); 
     final Scene scene = new javafx.scene.Scene(root); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

} 

MyController.java (simplificado):

public class MyController implements Initializable { 

    @Override 
    public void initialize(URL url, ResourceBundle rb) { 
     // HOW TO getParameters() HERE ? 
    } 

    @FXML 
    private Button myButton; 

    @FXML 
    private void my_Action(ActionEvent event) { 
     // HOW TO getParameters() HERE ? 
    } 

} 

MyView.fxml (simplificada):

<AnchorPane fx:id="root" fx:controller="mainpackage.MyController"> 
    <children> 
     <Button fx:id="myButton" onAction="#my_Action" text="Start" /> 
    </children> 
</AnchorPane> 

Respuesta

13

1. forma más directa - guardarlos en aplicación:

public class App extends Application { 

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

    public static String parameters; 

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

    parameters = getParameters().getNamed().toString(); 

    Parent root = FXMLLoader.load(getClass().getResource("MyView.fxml")); 
    final Scene scene = new javafx.scene.Scene(root); 
    primaryStage.setScene(scene); 
    primaryStage.show(); 
    } 

} 

y leerlos en el controlador:

public class MyController implements Initializable { 

    @Override 
    public void initialize(URL url, ResourceBundle rb) { 
    System.out.println(App.parameters); 
    } 

2. más compleja (pero mejor en general) los enfoques se describen en los siguientes temas:

+0

Eso es lo que hice, pero pensé que no había otra manera. Uno que podría evitar el "público estático". De todos modos ... Gracias, Sergey, esta es la segunda vez que me ayudas. – ohFRY

0
public static <T extends Node, P> T load(String resource, final P parameter) 
      throws MoisException { 
     try { 
      logger.debug("resource: {}; parameter: {}", resource, parameter); 
      FXMLLoader loader = new FXMLLoader(getResource(resource)); 
      // pass parameter into Controller,before invoke the initialize() 
      loader.setControllerFactory(new Callback<Class<?>, Object>() { 
       @Override 
       public Object call(Class<?> param) { 
        Object controller = null; 
        try { 
         controller = ReflectUtil.newInstance(param); 
        } catch (InstantiationException e) { 
         throw new MoisException("can't new instance for: " + param.getName(), e); 
        } catch (IllegalAccessException e) { 
         throw new MoisException("can't new instance for: " + param.getName(), e); 
        } 
        if (controller instanceof ParameterAware) { 
         ((ParameterAware<P>) controller).setParameter(parameter); 
        } 
        return controller; 
       } 
      }); 
      T node = (T) loader.load(); 
      // pass parameter to node 
      node.setUserData(parameter); 
      return node; 
     } catch (IOException e) { 
      throw new MoisException("can't load the file: " + resource, e); 
     } 
    } 

y la ParameterAware:

public interface ParameterAware<T> { 
    void setParameter(T param); 
} 
Cuestiones relacionadas