【发布时间】:2017-09-07 12:32:08
【问题描述】:
我是 Java FX 的新手,对控制器、FXML 文件及其交互有一些基本的理解问题。
我正在使用 Scenebuilder 并尝试了一些简单的方法。 我有一个只有 AnchorPane 的 FXML 文件,它与 Controller 类链接。它应该是我与其他 FXML 控制器一起玩的主要课程。
我有一个“Knopf”FXML,它只包含一个带有控制器“KnopfController”的按钮 我有一个“Feld”FXML,其中包括一个文本字段,它的控制器是“FeldController”。
“Knopf.FXML”和“Feld.FXML”都包含在锚窗格中。
我的代码如下所示:
package sample;
import javafx.fxml.FXML;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.AnchorPane;
public class Controller {
@FXML
private AnchorPane Main;
@FXML
private FeldController feldController;
@FXML
private KnopfController knopfController;
public void textChange(MouseEvent event){
//Hier Comes the Code
}
现在我的问题是:
如何在我的 Button(如果它被按下)和我的 TextField(当按下按钮时它应该说“Hello”?
Button(Knopf.FXML 中的 fx:id="Knopf")和 TextField(Feld.FXML 中的 fx:id="Feld")都应该对我有用。
我该如何存档?
我知道我可以在控制器中同时使用两者,但我想练习控制器和 FXML 文件之间的交互。
【问题讨论】:
-
好吧,我想我现在明白了。我必须在“Feld”控制器和“Knopf”控制器类中实现方法,所以我可以在我的主控制器类中使用它。
-
最好的方法是使用 MVC(或类似的)方法。与不同的控制器共享模型并更新/观察模型中的数据。参见例如stackoverflow.com/questions/32342864/applying-mvc-with-javafx。另一种方法是将
Controller的引用传递给KnopfController,这样你就可以在按钮事件处理程序中调用textChange(),然后只需定义一个方法来更新FeldController中的文本字段并调用它来自textChange()方法。 -
谢谢我尝试了你的第二种方法。我得到一个 NullpointerException,我在 KnopfController 中使用 textChange() 方法。我刚刚添加了@FXML Controller 控制器;到 KnopfController。你能告诉我我必须写什么才能将它放入 FXML 文件吗?将它包含在 SceneBuilder 中并不是我想的解决方案。
-
是的,那行不通(
Knopf.fxml中的fx:id="controller"没有任何内容)。您必须在KnopfController中创建一个setController(...)方法,并从主控制器的initialize()方法中调用knopfController.setController(this)。
标签: java javafx scenebuilder