我对java和javafx很陌生,有一个我无法解决的问题。我需要将新的自定义控件动态添加到 javafx 场景中。此外,我需要主控件和添加的控件之间的交互。我已经在网上找到了一些有用的信息,但无法将它们放在一起。
所以我举了一个小例子来解释:
主要类别:
public class Test_TwoController extends Application {
@Override
public void start(Stage stage) throws Exception {
Parent root = FXMLLoader.load(getClass().getResource("Fxml1.fxml"));
Scene scene = new Scene(root);
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
主fxml:
<AnchorPane id="fxml1_anchorpane_id" fx:id="fxml1_anchorpane" prefHeight="206.0" prefWidth="406.0" xmlns:fx="http://javafx.com/fxml" fx:controller="test_twocontroller.Fxml1Controller">
<children>
<HBox id="fxml1_hbox_id" fx:id="fxml1_hbox" prefHeight="200.0" prefWidth="400.0">
<children>
<Button id="fxml1_button_id" fx:id="fxml1_button" mnemonicParsing="false" onAction="#button_action" prefHeight="200.0" prefWidth="200.0" text="Button" />
</children>
</HBox>
</children>
</AnchorPane>
及其控制器:
public class Fxml1Controller implements Initializable {
@FXML HBox hbox;
@FXML Button button;
@Override
public void initialize(URL url, ResourceBundle rb) { }
public void button_action(ActionEvent event) throws IOException {
// 1. add an instance of Fxml2 to hbox
// 2. change to tab2 in new Fxml2
// or
// notify Fxml2Controller to change to tab2 in Fxml2
}
}
现在要动态添加的控件:
其影响:
<AnchorPane id="fxml2_anchorpane_id" fx:id="fxml2_anchorpane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="200.0" prefWidth="200.0" xmlns:fx="http://javafx.com/fxml" fx:controller="test_twocontroller.Fxml2Controller">
<children>
<TabPane id="fxml2_tabpane_id" fx:id="fxml2_tabpane" prefHeight="200.0" prefWidth="200.0" tabClosingPolicy="UNAVAILABLE">
<tabs>
<Tab id="fxml2_tab1_id" fx:id="fxml2_tab1" text="tab1">
<content>
<AnchorPane id="Content" minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0" />
</content>
</Tab>
<Tab id="fxml2_tab2_id" fx:id="fxml2_tab2" onSelectionChanged="#onSelectionChanged" text="tab2">
<content>
<AnchorPane id="Content" minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0" />
</content>
</Tab>
</tabs>
</TabPane>
</children>
</AnchorPane>
和控制器:
public class Fxml2Controller {
@FXML TabPane tabpane;
@FXML Tab tab1;
@FXML Tab tab2;
public Fxml2Controller() throws IOException {
Parent root = FXMLLoader.load(getClass().getResource("Fxml2.fxml"));
Scene scene = new Scene(root);
Stage stage = new Stage();
stage.setScene(scene);
}
public void onSelectionChanged(Event e) throws IOException {
FXMLLoader loader = new FXMLLoader();
// how can i get the current Fxml1 anchorpane instance?
AnchorPane root = (AnchorPane) loader.load(getClass().getResource("Fxml1.fxml").openStream());
Button b = (Button)root.lookup("#fxml1_button_id");
b.setText("New Button Text"); // dont change the buttons text!!!
}
}
用法是:应将fxml2添加到fxml1的hbox中。然后在fxml1中单击按钮后,fxml2的选项卡应更改。你可以看看那张照片http://s13.postimage.org/uyrmgylo7/two_controlls.png
所以我的问题是:
先谢谢你solarisx
你似乎混淆了几个截然不同的概念。首先,舞台可以理解为屏幕上的一个窗口。它有一个保存实际场景图的场景对象。在您的示例中,您正在创建一个新的舞台和一个新的场景,其中填充了您的第二个fxml文件的内容。这意味着,如果工作,第二个窗口将弹出包含您的东西。我不认为这是你想要实现的。
此外,当FXMLLoader读取文件时,它会查找指定为其控制器的类,并通过反射构造它的实例。这意味着当您在fxml文件的控制器构造函数中调用load方法时,您将导致无限循环。
最后要理解的是,< code>load()返回的对象是一个任意节点,可以像任何其他节点一样放入应用程序的场景图中。
因此,要使您的概念发挥作用,您应该执行以下操作:
load()
方法,您可以获取控制器实例。调用load()
后,您可以通过getController()
和getRoot()
检索fxml-file的控制器和根对象。然后您可以像使用逻辑中的任何任意对象一样使用它们。问题内容: 看来这个问题已经被问过几次了,但是没有正确的答案。 我的情况:我正在使用ajax(出于某种原因不使用角度路由模板)将模板(带有html和脚本)初始化为div。 index.html(主要) template.html(模板) 当我单击按钮时,它将文件加载到容器中,但是出现错误 错误:[ ng:areq ]参数’TempCtrl’不是函数,未定义 尽管已将其添加到应用控制器中。 我如何动
本文向大家介绍Angularjs 实现动态添加控件功能,包括了Angularjs 实现动态添加控件功能的使用技巧和注意事项,需要的朋友参考一下 实现下面这样的需求: 点击增加一块数据盘,会出现数据盘选项。 (1)最开始,想到原生JavaScript,jQuery (appendChild()等方法结合AngularJS来添加新的元素。但是突然发现控件里面的数据绑定,原生javascript没法控制
问题我想在运行时向gridpane添加通过javafx scene builder构建的定制面板。我的定制面板有按钮,标签等。 我的尝试我试图从窗格扩展... ...然后在conroller的添加方法中使用此面板 它工作,但它的表现非常非常差。 我想要的是有一种方法可以通过javafx scene builder设计面板(结果是在fxml中使用这个面板),然后在运行时将其添加到gridpane中,
本文向大家介绍ASP.NET动态添加用户控件的方法,包括了ASP.NET动态添加用户控件的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了ASP.NET动态添加用户控件的方法。分享给大家供大家参考。具体实现方法如下: 为了让用户控件能ASP.NET页面实现动态添加,首先写一个接口IGetUCable,这个接口有一个函数,返回对象类型是UserControl. 有了接口之后,需要创建用户
问题内容: 我有以下非常简单的代码 和背后的代码 我的问题在于,文字控件只能添加一次。我曾搜索过Google和博客网站(以及书籍),但没有任何运气。我想念什么? 问题答案: 在asp.net中,每次回发都会自动生成ASPX文件中的控件。您创建的控件不在ASPX代码中,因此框架不会为您创建它们。第一次执行Button1_Click方法时,您会向页面添加一个额外的控件。第二次执行Button1_Cli
问题内容: 问题 我想在运行时将通过javafx场景构建器构建的定制面板添加到网格窗格中。我的定制面板有按钮,标签等。 我尝试 从面板扩展… …然后在控制器的添加方法中使用此面板 它可以工作,但是性能非常差。 我正在寻找的方法 是否有一种通过javafx场景构建器设计面板的方法(因此将这些面板包含在fxml中),然后在运行时将其添加到网格窗格中,而无需为每个实例使用此fxmlloader。由于fx