gpt4 book ai didi

javafx-2 - 动态添加 JavaFX2 控件

转载 作者:行者123 更新时间:2023-12-04 15:01:30 38 4
gpt4 key购买 nike

我对 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>

及其 Controller :
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
}
}

现在动态添加控件:

它的 fxml:
<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>

和 Controller :
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!!!
}
}

用法是:在fxml1的hbox中添加一个fxml2。然后在 fxml1 中单击按钮后,fxml2 的选项卡应更改。
你可以看看那张图片 http://s13.postimage.org/uyrmgylo7/two_controlls.png

所以我的问题是:
  • 如何将一个或多个 fxml2 Controller 添加到 fxml1 的 hbox 中?
  • 如何从另一个控件访问一个控件或在控件之间进行通信?有关详细信息,请参阅 Fxml2Controller 中的 onSelectionChanged() 方法。

  • 先感谢您,
    日光

    最佳答案

    您似乎将很多不同的概念混合在一起。首先,一个舞台可以理解为屏幕上的一个窗口。它有一个 Scene 对象,用于保存实际的 SceneGraph。在您的示例中,您正在创建一个新舞台和一个新场景,其中填充了您的第二个 fxml 文件的内容。这意味着,如果工作正常,将弹出第二个窗口,其中包含您的内容。我认为这不是您想要实现的目标。

    此外,当 FXMLLoader 读取文件时,它会查找指定为其 Controller 的类并通过反射构造它的实例。这意味着当您在加载 fxml 文件的 Controller 的构造函数中调用 load 方法时,会导致无限循环。

    最后要理解的是 load() 的对象返回是一个任意节点,可以像任何其他节点一样放入应用程序的 SceneGraph 中。

    因此,要使您的概念发挥作用,您应该进行以下操作:

  • 将当前位于第二个 Controller 的构造函数中的加载代码移动到第一个 Controller 的 button_Action 方法中。
  • 扔掉 button_action 中的 new-stage-new-scene 代码,将 FXMLLoader 返回的 Node 添加到 HBox 的 child 中。
  • 对于您的第二个问题,如果您实际创建 FXMLLoader 的实例而不是调用静态方法,并使用 load(),您可以获得 Controller 实例。其中的方法。调用后load()您可以通过 getController() 检索 fxml 文件的 Controller 和根对象和 getRoot() .然后,您可以像使用逻辑中的任意对象一样使用它们。
  • 关于javafx-2 - 动态添加 JavaFX2 控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13465459/

    38 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com