【问题标题】:How do i add JavaFX elements with a loop?如何使用循环添加 JavaFX 元素?
【发布时间】:2020-03-13 16:25:53
【问题描述】:

我正在使用 JavaFX 和 SQL 创建一个迷你社交媒体,用户可以在其中创建帖子。我将每个帖子都放在一个窗格元素中,其中包括用户名、帖子日期和帖子中的文本。我想创建一个循环,插入存在的许多帖子。我只需要知道,如何创建一个循环,例如插入 5 个相同的窗格元素。 我在 fxml 文件中编写我的代码。我还有一个控制器,我可以在其中编写函数。 我无法在存在 javafx 元素的 fxml 文件中编写 java 代码,因此我需要以某种方式通过控制器中的循环插入窗格元素。

代码示例: 我没有编写代码,我只是在询问我应该采取什么方法。 下面是代码的样子:

<AnchorPane id="AnchorPane">
    <VBox layoutY="170.0" prefWidth="557.0">
        // Start Loop
          <Pane>
             <children>
                  <Label text="Test Person" />
                <Label text="Date of Post" />
                <TextArea text="Text in Post"/>
             </children>
          </Pane>
       // End Loop
    </VBox>
</AnchorPane>

这是帖子的外观图片:

【问题讨论】:

  • 你需要发布你的代码。
  • 您可能希望使用ListView 并让每个ListCell 处理显示其项目(即使用自定义单元格实现将您的帖子视图设置为单元格的图形)。然后您只需将所有帖子(由模型类表示)添加到列表视图的items
  • @akuzminykhI 我还没有编写代码,我只是在询问我应该采取什么方法。我已经勾勒出了代码的样子,上面已经更新了:)
  • 当然核心 JavaFX 允许您使用自定义单元,它是虚拟化控件的主要功能之一(即 ListViewTableViewTreeTableViewTreeView)。创建一个ListView 并设置它的cellFactory 属性。

标签: java loops javafx fxml scenebuilder


【解决方案1】:

例子:

String template = "" +
            "<AnchorPane id=\"AnchorPane\">\n" +
            "    <VBox layoutY=\"170.0\" prefWidth=\"557.0\">\n" +
            "        // Start Loop\n" +
            "          <Pane>\n" +
            "             <children>\n" +
            "                  <Label text=\"%text person%\" />\n" +
            "                <Label text=\"%date of post%\" />\n" +
            "                <TextArea text=\"%text in post%\"/>\n" +
            "             </children>\n" +
            "          </Pane>\n" +
            "       // End Loop\n" +
            "    </VBox>\n" +
            "</AnchorPane>";

    StringBuilder sb = new StringBuilder();
    //Loop through the posts
    for (int i = 0; i<postNumber; i++) {
        sb.append(
                template
                        .replaceAll("%text person%", thePerson)
                        .replaceAll("%date of post%", theDate)
                        .replaceAll("%text in post%", text));
    }
    String outer =
            "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
            "\n" +
            "<?import java.lang.*?>\n" +
            "<?import java.util.*?>\n" +
            "<?import javafx.scene.*?>\n" +
            "<?import javafx.scene.control.*?>\n" +
            "<?import javafx.scene.layout.*?>\n" +
            "\n" +
            "<AnchorPane xmlns=\"http://javafx.com/javafx\"\n" +
            "            xmlns:fx=\"http://javafx.com/fxml\"\n" +
            "            fx:controller=\"me.mkdomain.deeplearning.D\"\n" +
            "            prefHeight=\"400.0\" prefWidth=\"600.0\">\n" +
            "%content%\n" +
            "</AnchorPane>";
    String done = outer.replaceAll("%content%", sb.toString());
    FileOutputStream out = new FileOutputStream("myfile.fxml");
    out.write(done.getBytes());
    out.close();
    FXMLLoader loader = new FXMLLoader();
    loader.load(new FileInputStream("myfile.fxml"));

【讨论】:

  • 如果您想添加更多信息,您可以并且应该编辑您的原始答案。
【解决方案2】:

您可以使用 StringBuilder 来制作 fxml。然后你可以把它写到一个临时文件中,然后你就可以加载它了。

【讨论】:

  • 你能澄清一下吗?我找不到任何相关的教程。
猜你喜欢
  • 1970-01-01
  • 2013-06-03
  • 2018-01-27
  • 1970-01-01
  • 2019-09-14
  • 1970-01-01
  • 2021-12-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多