如何通过javafx中的id动态查找FXML变量?

问题描述 投票:0回答:2

我正在尝试创建HTML编辑器(用于学习目的,并且试图使程序尽可能地动态。我想通过其ID查找FXML变量(如TextField),并在按下按钮时检索文本字段中的文本。

我设置了2个Map变量

 public FXMLDocumentController() {
        this.HTMLtags = new HashMap<>();
        HTMLtags.put("pressMeButton", "h2.fx-h2");
        HTMLtags.put("setNewsMessageButton", "p.fx-message");

        this.elementsMap = new HashMap<>();
        elementsMap.put("pressMeButton", "newsTitle");
        elementsMap.put("setNewsMessageButton", "newsMessage");
    }

HTMLtags包含将要编辑的按钮ID和HTML标记。elementsMap包含假定要从中获取文本的按钮ID和TextView ID。有点像“将特定按钮绑定到特定文本字段”。

private void changeText(ActionEvent event) throws IOException {
Object source = event.getSource();
                Button clickedButton = (Button) source;
                System.out.println(HTMLtags.get(clickedButton.getId()));
                System.out.println(elementsMap.get(clickedButton.getId()));
                writeToHTML(HTMLtags.get(clickedButton.getId()), elementsMap.get(clickedButton.getId()));
}

上述方法正确检索了需要编辑的按钮和HTML标记的ID。

这里是在HTML中设置文本的代码

private void writeToHTML(String HTMLTag, String textField) {
        File input = new File(filePath);
        Document doc;
        try {
            doc = Jsoup.parse(input, "UTF-8");

            Element head = doc.select(HTMLTag).first();
            originalText = head.toString();

            TextField textFieldName = new TextField();
            textFieldName.setId(textField);
            head.text(textFieldName.getText());


            System.out.println("Original Text is: " + originalText);
            System.out.println("Modified Text is: " + head);

            Path path = Paths.get(filePath);
            Charset charset = StandardCharsets.UTF_8;

            String content = new String(Files.readAllBytes(path), charset);
            content = content.replaceAll(originalText, head.toString());
            Files.write(path, content.getBytes(charset));

        } catch (IOException ex) {
            Logger.getLogger(FXMLDocumentController.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

问题是我不知道如何在此部分代码中专门从文本字段中查找和检索文本

TextField textFieldName = new TextField();
                textFieldName.setId(textField);
                head.text(textFieldName.getText());

我想动态地做到这一点,而无需通过以下方式声明每个FXML元素@FXML私有TextField“ fx:id的名称”,并通过循环匹配每个元素。

我想这样做,类似于通过ActionEvent获取按钮的ID /值。

编辑:这是完整的FXML btw

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.geometry.*?>
<?import javafx.scene.text.*?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>

<AnchorPane id="AnchorPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="600.0" prefWidth="800.0" xmlns="http://javafx.com/javafx/8.0.66" xmlns:fx="http://javafx.com/fxml/1" fx:controller="newsletter.editor.FXMLDocumentController">
   <children>
      <ScrollPane fitToWidth="true" prefHeight="800.0" prefWidth="1280.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
         <content>
            <VBox alignment="CENTER" prefHeight="450.0">
               <children>
                  <HBox alignment="CENTER">
                     <children>
                        <Label alignment="CENTER" minHeight="25.0" minWidth="192.0" prefHeight="50.0" prefWidth="192.0" text="Newsletter Title" wrapText="true">
                           <font>
                              <Font size="18.0" />
                           </font>
                        </Label>
                        <TextField id="newsTitle" fx:id="newsTitle" prefHeight="28.0" prefWidth="180.0" promptText="Write here" HBox.hgrow="ALWAYS" />
                     </children>
                  </HBox>
                  <HBox prefHeight="100.0" prefWidth="200.0">
                     <children>
                        <TextArea fx:id="newsMessage" prefHeight="100.0" prefWidth="766.0" />
                     </children>
                  </HBox>
                  <HBox prefHeight="100.0" prefWidth="200.0" />
                  <HBox prefHeight="100.0" prefWidth="200.0" />
                  <HBox alignment="CENTER" prefHeight="100.0" prefWidth="200.0">
                     <children>
                        <Button fx:id="setNewsMessageButton" mnemonicParsing="false" onAction="#changeText" text="MAGIC" />
                        <Button fx:id="pressMeButton" mnemonicParsing="false" onAction="#changeText" text="Press Me for Magic">
                           <HBox.margin>
                              <Insets right="10.0" />
                           </HBox.margin>
                        </Button>
                        <Button fx:id="filePathButton" mnemonicParsing="false" onAction="#filePathSave" text="Select Path">
                           <HBox.margin>
                              <Insets right="10.0" />
                           </HBox.margin>
                        </Button>
                        <Button fx:id="popoverButton" mnemonicParsing="false" onAction="#popOverTrigger" text="PopOver Test">
                           <HBox.margin>
                              <Insets right="10.0" />
                           </HBox.margin>
                        </Button>
                     </children>
                  </HBox>
               </children>
               <padding>
                  <Insets left="20.0" right="20.0" />
               </padding>
            </VBox>
         </content>
      </ScrollPane>
   </children>
</AnchorPane>
java html javafx fxml
2个回答
1
投票

您可以执行ID查找以找到TextField

Parent parent = getTextFieldParent(); // the Parent (or Scene) that contains the TextFields
TextField textField = (TextField) parent.lookup("#myTextField");
if (textField != null)
    String text = textField.getText();

0
投票

是,您的需要方法lookup()。不仅Parent类具有此方法,而且在Panel类中也具有FlowPane,AnchorPane和许多其他类。这也是Scene类中的此方法。

但是!此方法仅在场景显示后查找。我现在不知道为什么发生这种情况,但是在场景show()之前,lookup()仅找到顶层面板。然后在show()之后按ID查找元素,例如scene.lookup("#myId");必须输入符号#

lookup()方法可以通过类型查找没有id的元素。

示例:scene.lookup("FlowPane");(不带#)将在您的.fxml文件中找到第一个FlowPane。 scene.lookupAll("ImageView");将返回场景中所有ImageView元素的质量。

© www.soinside.com 2019 - 2024. All rights reserved.