通过 fxml 文件将 TextFields 的 JavaFX Tab-Button 排序从 "Left to Right" 更改为 "Right to Left"

Change JavaFX Tab-Button orderring of TextFields from "Left to Right" to "Right to Left" by fxml file

在提问之前,我应该说答案可能在 JavaFX: How to change the focus traversal policy? 中找到,但我不寻找任何 java 代码,我想要一种通过编辑 Fxml 的方法文件

有一个包含一些 TextField 的 FXML 文件,我想更改我的 TextField 的焦点遍历策略: 我的意思是,在应用程序开始时,光标必须位于 id1,然后通过按 TAB 键,它必须转到 id2 等等。

!!!! ID1-->ID2-->ID3-->ID4-->ID5-->ID6 !!!!

注意我的TextField的位置应该如下图所示。

为此,我更改了 FXML 文件中文本字段的顺序:

<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1">
   <children>
      <TextField fx:id="id1" layoutX="401.0" layoutY="41.0" promptText="id1" />
      <TextField fx:id="id2" layoutX="168.0" layoutY="41.0" promptText="id2" />
      <TextField fx:id="id3" layoutX="401.0" layoutY="110.0" promptText="id3" />
      <TextField fx:id="id4" layoutX="168.0" layoutY="110.0" promptText="id4" />
      <TextField fx:id="id5" layoutX="401.0" layoutY="174.0" promptText="id5" />
      <TextField fx:id="id6" layoutX="401.0" layoutY="249.0" promptText="id6" />
   </children>
</AnchorPane>

它对我来说工作正常,但现在我遇到了一个大问题,当我在 HBox 中包装两个 TextFields(Id1 和 Id2)时。这种方法没有给我正确的结果,并且焦点遍历的顺序已经改变。

修改后的FXML如下:

<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="Bank.LayoutController">
   <children>
      <HBox layoutX="168.0" layoutY="41.0" spacing="80.0">
         <children>
             <TextField fx:id="id2" layoutX="168.0" layoutY="41.0" promptText="id2" />
             <TextField fx:id="id1" layoutX="401.0" layoutY="41.0" promptText="id1" />
         </children>
      </HBox>
      <TextField fx:id="id3" layoutX="401.0" layoutY="110.0" promptText="id3" />
      <TextField fx:id="id4" layoutX="168.0" layoutY="110.0" promptText="id4" />
      <TextField fx:id="id5" layoutX="401.0" layoutY="174.0" promptText="id5" />
      <TextField fx:id="id6" layoutX="401.0" layoutY="249.0" promptText="id6" />
   </children>
</AnchorPane>

结果的屏幕截图如下图所示(你可以看到起始点已更改为 id2 然后按 Tab 键光标转到 id1... !!!! ID2-->ID1-->ID3-->ID4-->ID5-->ID5!!! )

所以!?!?如何在用户单击 TAB 时更改我的 TextField 的焦点遍历。

看起来如果你只有一个 anchorPane 就很容易,但是如果你有 HBox 它从右侧开始到左侧。

默认情况下,当按下 Tab 键时,焦点会(向右)转移到下一个组件,但正如我提到的,我想要从左到右!!

有什么解决办法吗?

有多种方法可以实现所述行为。一种非常简单的技术是在 TextFields 的父级上使用 NodeOrientation,并在父级中对其进行排序。

我重新修改了您的代码以使其更易于维护。可以注意以下几点以便更好地理解:

  • 我使用的是 VBox 中包含的 4 个 HBox,而不是 1 个
  • 每个HBox根据需要有一个/两个TextField。它可能包含两个以上
  • 每个 HBox 的 nodeOrientation 是 RIGHT_TO_LEFT
  • 第一个HBox的第一个元素是TextFieldid1而不是id2,这使得它成为场景加载时第一个被关注的元素
  • 所有的HBox都包含在一个VBox中,实现不同HBox中TextField之间的焦点遍历

FXML

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

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


<VBox xmlns="http://javafx.com/javafx/8.0.40" xmlns:fx="http://javafx.com/fxml/1">
   <children>
      <HBox maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" nodeOrientation="RIGHT_TO_LEFT" prefHeight="32.0" prefWidth="600.0">
         <children>
            <TextField promptText="id1" />
            <TextField promptText="id2" />
         </children>
      </HBox>
      <HBox maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" nodeOrientation="RIGHT_TO_LEFT" prefHeight="35.0" prefWidth="600.0">
         <children>
            <TextField promptText="id3" />
            <TextField promptText="id4" />
         </children>
      </HBox>
      <HBox maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" nodeOrientation="RIGHT_TO_LEFT" prefHeight="34.0" prefWidth="600.0">
         <children>
            <TextField promptText="id5" />
         </children>
      </HBox>
      <HBox maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" nodeOrientation="RIGHT_TO_LEFT" prefHeight="400.0" prefWidth="600.0">
         <children>
            <TextField promptText="id6" />
         </children>
      </HBox>
   </children>
</VBox>