陷入事件处理Java FX - Controller - 场景构建器

时间:2012-11-05 21:01:46

标签: javafx scenebuilder

我想将Netbeans Java FX与Scene构建器一起用于测量应用程序。我设计了一个带控件的场景。我可以在'... Controller.java'中处理来自UI控件的事件。

'controller'是XML文件中引用的标准代码段,由系统初始化:

public void initialize(URL url, ResourceBundle rb) { ..

我的问题:如何从控制器中访问我的中心,持久,'模型'对象?或者,更确切地说,来自在控制器初始化函数中创建的事件处理程序。

'model'对象将在应用程序对象中创建。

解决方案必须是微不足道的,但我还没有找到方法

  • 从控制器访问应用程序
  • 或从应用程序中访问控制器。 我错过了什么?

(接下来的问题是如何访问由屏幕构建器创建的对象层次结构中的窗格树,例如,对于输出上的图形操作。由于对象不是由自己的代码创建的,因此我无法存储对其中某些对象的引用好吧,它们也许可以通过树木行走找到并引用,但必须有更好的方法!)

感谢您的所有见解!

1 个答案:

答案 0 :(得分:3)

我使用了第二种方法(从应用程序中访问控制器)一段时间以前类似于以下内容。在Application类中:

//..
private FooController fooController;
private Pane fooPage;
private Model myModel;

@Override
public void start(Stage stage) {
    //..
    myModel = new Model();
    getFooController().updateModel(myModel);
    //..
    Button button = new Button("Update model with new one");
    button.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                Model myNewModel = new Model();
                getFooController().updateModel(myNewModel);
            }
    }
    // create scene, add fooPage to it and show.
}

private FooController getFooController() {
    if (fooController == null) {
       FXMLLoader fxmlLoader = new FXMLLoader();
       fooPage = fxmlLoader.load(getClass().getResource("foo.fxml").openStream());
       fooController = (FooController) fxmlLoader.getController();
    }
    return fooController;
}

实际上,问题的第一部分和第二部分会回答JavaFX 2.0 + FXML. Updating scene values from a different Task类似的问题。