0

在问之前,我应该说可以在JavaFX 中找到答案:如何更改焦点遍历策略?,但我不寻找任何java代码,我想通过编辑Fxml文件的方式

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

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

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

在此处输入图像描述

因此,为此我更改了 FXML 文件中 textFields 的顺序:

<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 中包装两个 TextField( 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 键时,焦点转移(向右)到下一个组件,但正如我提到的,我想要从左到右!

有什么解决办法吗?

4

1 回答 1

2

有多种方法可以实现所述行为。一个非常简单的技术是在 TextField 的 Parent 上使用NodeOrientation,以及它在 Parent 中的排序。

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

  • 我使用的是包含在 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>
于 2015-05-07T08:30:14.907 回答