当前位置: 首页 > 知识库问答 >
问题:

如何在JavaFX中动态地按id查找FXML变量?

汝臻
2023-03-14

我试图创建一个HTML编辑器(学习目的),我试图使程序尽可能动态。我希望通过它的id查找FXML变量,如TextField,并在按下按钮时检索TextField中的文本。

我设置了2个映射变量

 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");
    }
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()));
}
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());

我希望类似于通过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>

共有1个答案

万俟沛
2023-03-14

您可以执行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();
 类似资料:
  • 我最近遇到了一个问题,我需要从窗口中使用的节点获取特定节点(最好是通过id)。Im使用FXMLLoader,所以第一个想法是搜索树结构FXMLLoader返回。 进一步的研究让我在场景类中查找方法,但是官方留档(https://docs.oracle.com/javase/8/javafx/api/javafx/scene/Scene.html#lookup-java.lang.String-)缺

  • 问题内容: 我需要使用ObjectIdHex获取值,并进行更新并查看结果。我正在使用mongodb和golang,但是下面的代码无法正常工作 没有为我工作,并给我以下输出 我该如何解决这个问题?我需要使用oid获得价值并进行更新,我该怎么做 问题答案: 应该不是:

  • 我有一个带有EditText的对话框,在那里,它要求一个钱包,用户写它。 之后,这个钱包应该存储在一个字符串中,但它说它是空的。 尝试在空对象引用上调用虚拟方法android.text.可编辑android.widget.EditText.getText() 如果我使用活动中的编辑文本,效果很好。但当我在EditText(eTW)对话框中执行时,它失败了。 这是我的密码。

  • 如何在FXML中定义表,然后使用JavaFX代码在运行时动态填充表?

  • 问题内容: 我正在使用Selenium,需要获取控件的ID,但是ID是动态的,我无法获取。 数字1122是动态的,并且其他按钮的开头相同。 问题答案: 我已经多次回答类似的问题,您可能想看看。 ExtJS页面很难测试,尤其是在查找元素时。 以下是一些我认为有用的提示: 永远不要使用动态生成的ID。喜欢 永远不要使用绝对/无意义的XPath,例如 利用有意义的自动生成的部分ID和类名。(因此,在我的

  • 我想通过我提供的id从托管bean中找到一些。