如何使用id在JavaFx中获取元素?
我是FXML新手,我正在尝试使用如何使用id在JavaFx中获取元素?,java,javafx,fxml,Java,Javafx,Fxml,我是FXML新手,我正在尝试使用开关为所有按钮点击创建一个处理程序。但是,为了做到这一点,我需要使用和id获取元素。我尝试了以下方法,但出于某种原因(可能是因为我在控制器类中而不是在主类中进行),我得到了一个堆栈溢出异常 public class ViewController { public Button exitBtn; public ViewController() throws IOException { Parent root = FXMLLoade
开关
为所有按钮点击创建一个处理程序。但是,为了做到这一点,我需要使用和id获取元素。我尝试了以下方法,但出于某种原因(可能是因为我在控制器类中而不是在主类中进行),我得到了一个堆栈溢出异常
public class ViewController {
public Button exitBtn;
public ViewController() throws IOException {
Parent root = FXMLLoader.load(getClass().getResource("mainWindow.fxml"));
Scene scene = new Scene(root);
exitBtn = (Button) scene.lookup("#exitBtn");
}
}
那么,如何使用元素的id作为引用来获取元素(例如按钮)
按钮的fxml块为:
<Button fx:id="exitBtn" contentDisplay="CENTER" mnemonicParsing="false"
onAction="#handleButtonClick" text="Exit" HBox.hgrow="NEVER" HBox.margin="$x1"/>
使用控制器类,这样就不需要使用查找。
FXMLLoader
将为您将字段注入控制器。注入保证在调用initialize()
方法(如果有)之前发生
public class ViewController {
@FXML
private Button exitBtn ;
@FXML
private Button openBtn ;
public void initialize() {
// initialization here, if needed...
}
@FXML
private void handleButtonClick(ActionEvent event) {
// I really don't recommend using a single handler like this,
// but it will work
if (event.getSource() == exitBtn) {
exitBtn.getScene().getWindow().hide();
} else if (event.getSource() == openBtn) {
// do open action...
}
// etc...
}
}
在FXML的根元素中指定控制器类:
最后,从控制器类以外的类(可能但不一定是应用程序
类)加载FXML
在混合使用
id
和fx:id
标记时,请使用a<代码>查找基于id
fx:id
用于注入控制器类。@James\D这是一个控制器class@sillyfly好的,但仍然是。我该怎么做?我尝试的方法不起作用,因为我无法从fxml文件中获取场景。为什么要在控制器中加载fxml?这毫无意义:您创建了一个加载FXML的控制器实例,在此期间创建了另一个控制器实例……我想说的是,例如,您定义为private button exitBtn的按钮代码>不是实际的exitBtn。这只是一个按钮参考。因此,如果另一个按钮处理程序(即openBtn
)指向相同的方法,则该按钮将hide()
,而不是exit按钮no,因为在这种情况下if
中的条件将计算为false。(Java中的所有对象都是通过引用访问的:如果您使用查找,这在控制器中非常困难,您仍然会有对按钮的引用。)好的,我明白了。我还没有意识到使用与fx:id=“exitBtn”
中定义的相同的变量名作为引用fx:id
指定FXML加载器将元素创建的对象注入的字段名。如果您熟悉iOS开发,fx:id
有效地为对象创建了苹果所称的“出口”。如果在控制器类中定义具有相同名称的字段,fxmloader
将自动将对象实例映射到该字段。
Parent root = FXMLLoader.load(getClass().getResource("path/to/fxml"));
Scene scene = new Scene(root);
// etc...