Controller.java文件中的Javafx 2.0操作方法Application.getParameters()
考虑以下样本。
如何访问控制器中应用程序的参数/参数?
谢谢。
注意:我曾尝试将App.java和MyController.java混合在一个Class文件中,但没有帮助。
App.java(简化):
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(简化):
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(简化):
1.最简单的方法 – 将它们保存在应用程序中:
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(); } }
并在控制器中读取它们:
public class MyController implements Initializable { @Override public void initialize(URL url, ResourceBundle rb) { System.out.println(App.parameters); }
2.在下一个主题中描述了更复杂(但更好的一般)方法:
- 传递参数JavaFX FXML
- 带控制器的多个FXML,共享对象
public static 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, 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) 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); } }
和ParameterAware:
public interface ParameterAware { void setParameter(T param); }