(DUPLICATE&已解决 - 见下面的答案)
我正在JavaFX中完成我的第一步,似乎很难使用“SceneBuilder”。我已经习惯了Android和QtCreator。在我看来,访问UI组件更容易。
类似findViewById(R.id.btnPushMe);
< - Android代码
实际上我得到了一个解决方案,但使用起来非常不舒服。这看起来像这样:
FXMLLoader loader = new FXMLLoader(MainApp.class.getResource("../fmxl/main.fxml"));
AnchorPane pane = loader.load();
System.out.println("panechilds:" + pane.getChildren().size());
BorderPane border = (BorderPane) pane.getChildren().get(0);
System.out.println("borderchilds:" + border.getChildren().size());
xml ..
<AnchorPane fx:id="mAnchor" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="600.0" prefWidth="800.0"
xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="app.progui.MainController">
<children>
<BorderPane layoutX="-1.0" prefHeight="600.0" prefWidth="800.0">
<top>
...
提前致谢 马丁
这是一个重复的问题(但我不会删除它,因为我花了一些时间来找到答案 - 也许是因为JavaFX没有像Android问题那样被问到......)
AnchorPane anchor = (AnchorPane) scene.lookup("#mAnchor");
答案 0 :(得分:4)
设计FXML时,通常会设计三个方面:应用程序逻辑,GUI控制器逻辑和FXML。
在加载和初始化期间,FXML加载器会将对您希望访问的UI控件的引用注入到控制器类中,这样您就不需要使用FindById()方法。
控制器类看起来类似于:
class DCServRecEditor extends DialogController {
@FXML // ResourceBundle that was given to the FXMLLoader
private ResourceBundle resources;
@FXML // URL location of the FXML file that was given to the FXMLLoader
private URL location;
@FXML // fx:id="ancMatchSelector"
private AnchorPane ancMatchSelector; // Value injected by FXMLLoader
@FXML // fx:id="ancServEditor"
private AnchorPane ancServEditor; // Value injected by FXMLLoader
@FXML // fx:id="ancServRecEditor"
private AnchorPane ancServRecEditor; // Value injected by FXMLLoader
:
:
FXML加载工具会自动将引用注入到使用@FXML
标记注释的实例字段中。要操作UI控件,只需使用适当的引用访问其方法。
非常需要将UI控制逻辑与应用程序逻辑分开,并实现关注点分离&#34;。当你习惯用这种方式设计FXML UI时,你就会喜欢它。
答案 1 :(得分:4)
您应该使用controller class并访问那里的UI元素。
基本上你这样做:
<AnchorPane fx:id="mAnchor" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="600.0" prefWidth="800.0"
xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="app.progui.MainController">
<children>
<BorderPane fx:id="border" layoutX="-1.0" prefHeight="600.0" prefWidth="800.0">
<top>
...
然后您可以使用
访问控制器中的fx:id
- 归因元素
package app.progui ;
// ...
public class MainController {
@FXML
private BorderPane border ;
public void initialize() {
border.setStyle("-fx-background-color: antiquewhite;");
// ...
}
// ...
}
控制器类中的字段名称必须与FXML文件中的fx:id
值匹配。
可以访问调用fx:id
的类中的FXMLLoader
- 归因元素,但如果您需要这样做,通常表明您的整体设计有误。你可以这样做:
FXMLLoader loader = new FXMLLoader(MainApp.class.getResource("../fmxl/main.fxml"));
AnchorPane pane = loader.load();
Map<String, Object> fxmlNamespace = loader.getNamespace();
BorderPane border = (BorderPane) fxmlNamespace.get("border");
假设FXML中定义的fx:id
在上面剪断。