如何使用 id 获取 JavaFx 中的元素?
how do I get an element in JavaFx using an id?
我是 FXML 的新手,我正在尝试使用 switch
为所有按钮点击创建一个处理程序。但是,为了这样做,我需要使用和 id 获取元素。我尝试了以下方法,但出于某种原因(可能是因为我是在控制器 class 而不是主控制器中进行的)我得到了堆栈溢出异常。
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"/>
使用控制器class,这样您就不需要使用查找。 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 的根元素中指定控制器 class:
<!-- imports etc... -->
<SomePane xmlns="..." fx:controller="my.package.ViewController">
<!-- ... -->
<Button fx:id="exitBtn" contentDisplay="CENTER" mnemonicParsing="false" onAction="#handleButtonClick" text="Exit" HBox.hgrow="NEVER" HBox.margin="$x1" />
<Button fx:id="openBtn" contentDisplay="CENTER" mnemonicParsing="false" onAction="#handleButtonClick" text="Open" HBox.hgrow="NEVER" HBox.margin="$x1" />
</SomePane>
最后,从您的控制器 class 以外的 class(也许,但不一定是您的 Application
class)和
Parent root = FXMLLoader.load(getClass().getResource("path/to/fxml"));
Scene scene = new Scene(root);
// etc...
我是 FXML 的新手,我正在尝试使用 switch
为所有按钮点击创建一个处理程序。但是,为了这样做,我需要使用和 id 获取元素。我尝试了以下方法,但出于某种原因(可能是因为我是在控制器 class 而不是主控制器中进行的)我得到了堆栈溢出异常。
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"/>
使用控制器class,这样您就不需要使用查找。 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 的根元素中指定控制器 class:
<!-- imports etc... -->
<SomePane xmlns="..." fx:controller="my.package.ViewController">
<!-- ... -->
<Button fx:id="exitBtn" contentDisplay="CENTER" mnemonicParsing="false" onAction="#handleButtonClick" text="Exit" HBox.hgrow="NEVER" HBox.margin="$x1" />
<Button fx:id="openBtn" contentDisplay="CENTER" mnemonicParsing="false" onAction="#handleButtonClick" text="Open" HBox.hgrow="NEVER" HBox.margin="$x1" />
</SomePane>
最后,从您的控制器 class 以外的 class(也许,但不一定是您的 Application
class)和
Parent root = FXMLLoader.load(getClass().getResource("path/to/fxml"));
Scene scene = new Scene(root);
// etc...