2012-04-13 9 views
8

Betrachtet das folgende Beispiel.Javafx 2.0 How-to Application.getParameters() in einer Controller.java-Datei

Wie Zugriff auf Argumente/Parameter der Anwendung in der Steuerung?

Vielen Dank.


NB: Ich habe versucht, in nur einer Klasse-Datei App.java und MyController.java zu mischen, aber nicht helfen.


App.java (vereinfacht):

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 (vereinfacht):

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 (vereinfacht):

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

Antwort

13

1. direkteste Art und Weise - sie in App sparen:

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(); 
    } 

} 

und sie in der Steuerung lesen:

public class MyController implements Initializable { 

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

2. Komplexere (aber besser im Allgemeinen) Ansätze werden in den nächsten Themen beschrieben:

+0

Das ist, was ich tat, aber ich dachte, dass es eine andere Art und Weise waren. Eine, die die "öffentliche Statik" vermeiden könnte. Wie auch immer ... Danke Sergey, das ist das zweite Mal, dass du mir hilfst. – 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); 
     } 
    } 

und die ParameterAware:

public interface ParameterAware<T> { 
    void setParameter(T param); 
} 
Verwandte Themen