【问题标题】:JavaFx- Clone tab dynamically based on inputJavaFx- 根据输入动态克隆选项卡
【发布时间】:2018-07-10 16:48:21
【问题描述】:

我正在解析一个 XML 文件并使用 XML 值填充 javafx 字段。 但是,这些字段位于选项卡中,我想根据 XML 中的节点数克隆选项卡及其内容。 下面是fxml文件截图:

我知道这样做的一种方法是将选项卡内容放在单独的 FXML 文件中并将其包含在内,但这样做的问题是我必须用数据填充字段并且如果出现以下情况我将无法填充数据使用重复的 fx:ids 多次加载相同的 fxml 文件。

有什么方法可以达到上述目的?

【问题讨论】:

  • 好吧,如果您加载单独的 fxml,您将能够填充数据,您只需要为选项卡的每个实例使用单独的控制器,如果您将它们全部添加到 arraylist,它应该相对容易跟踪每个选项卡是否具有单独的识别功能
  • @Matt 我们如何为每个标签设置控制器,因为我想动态添加标签?
  • 抱歉没有看到你的回复

标签: javafx javafx-8 fxml


【解决方案1】:

这是一个读取 cmets 的示例,如果您想为自己节省一行代码,您可以在选项卡中使用 fxml 并将其加载到选项卡窗格中

主类

public class Main extends Application {

    @Override
    public void start(Stage stage) {
        TabPane tabPane = new TabPane();
        ArrayList<Controller> controllerArrayList = new ArrayList<>();

        for (int i = 0; i < 5; i++) {
            //Don't just load it into the new node save a reference
            FXMLLoader loader = new FXMLLoader(getClass().getResource("/sample.fxml"));
            try {
                //Load it into the new parent node
                Tab tab = new Tab("Tab:"+i, loader.load());
                //Save contoller to arraylist of controllers
                controllerArrayList.add(loader.getController());
                //Add to tabPane
                tabPane.getTabs().add(tab);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        //Do some stuff with your contollers
        int index = 0;
        for (Controller controller : controllerArrayList) {
            controller.setLabel("index:"+index);
            controller.setTextField("index:"+index++);
        }

        Scene scene = new Scene(tabPane);
        stage = new Stage();
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) { launch(args); }
}

控制器类

public class Controller{

    public TextField textField;
    public Label label;

    public void setTextField(String text){ textField.setText(text); }

    public void setLabel(String text){ label.setText(text); }
}

FXML

<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.VBox?>
<VBox alignment="CENTER" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="Controller">
   <children>
       <Label fx:id="label"/>
      <TextField fx:id="textField" />
   </children>
</VBox>

【讨论】:

    猜你喜欢
    • 2012-11-06
    • 1970-01-01
    • 2011-08-20
    • 2019-10-31
    • 2012-10-02
    • 2015-11-10
    • 1970-01-01
    • 1970-01-01
    • 2019-03-03
    相关资源
    最近更新 更多