将文本字段的JavaFX选项卡按钮顺序从“更改为”;“从左到右”;至;“从右到左”;通过fxml文件

将文本字段的JavaFX选项卡按钮顺序从“更改为”;“从左到右”;至;“从右到左”;通过fxml文件,java,javafx,javafx-8,scenebuilder,keyboardfocusmanager,Java,Javafx,Javafx 8,Scenebuilder,Keyboardfocusmanager,在询问之前,我应该说的答案可以在中找到,但我不寻找任何java代码,我想通过编辑Fxml文件找到一种方法 有一个FXML文件中有一些文本字段,我想更改我的文本字段的焦点遍历策略: 我的意思是,在应用程序开始时,光标必须位于id1,然后按TAB按钮,光标必须转到id2,等等 !!!!ID1-->ID2-->ID3-->ID4-->ID5-->ID6 请注意,我的文本字段的位置应如下图所示 为此,我更改了FXML文件中文本字段的顺序: <AnchorPane maxHeight="-Infi

在询问之前,我应该说的答案可以在中找到,但我不寻找任何java代码,我想通过编辑Fxml文件找到一种方法

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

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

请注意,我的文本字段的位置应如下图所示

为此,我更改了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中包装两个文本字段(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!!!)

那么!?!?当用户单击选项卡时,如何更改文本字段的焦点遍历

看起来,如果你有一个锚烷,这很容易,但如果你有HBox,它从右到左开始

默认情况下,当按下tab键时,焦点会(向右)移动到下一个组件,但正如我提到的,我希望从左向右


有什么解决办法吗?

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

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

  • 我使用的不是1,而是VBox中包含的4个HBox
  • 根据需要,每个HBox都有一个/两个文本字段。它可能包含两个以上
  • 每个HBox的节点方向为
    从右到左
  • 第一个HBox的第一个元素是TextField
    id1
    ,而不是
    id2
    ,这使得它成为加载场景时关注的第一个元素
  • 所有HBox都包含在VBox中,以便在不同HBox中包含的文本字段之间进行焦点遍历
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>


@Kleopatra您标记为重复的问题有一个可接受的答案,该答案使用了
不推荐的
方法。这可能会诱使用户使用
不推荐的
方法来找到他们的解决方案。@ItachiUchiha true,但它始终是内部的;-)可悲的事实是,在fx中没有公共的、安全的支持来配置焦点遍历(使用布局进行frickling是不可行的选择)@kleopatra请您解释一下
使用布局进行frickling是不可行的选择
:)@ItachiUchiha,因为布局只是:组件放置在其父级的某个位置。它在语义上与焦点遍历无关。在任何中间复杂的ui中,混合正交方面都会导致地狱。至于可行性:它和任何黑客一样坏或好,没有什么值得支持的——但在其他QA中已经提到了。顺便说一句:副本中接受的答案需要更新为。。。更改了内部api@kleopatra ah,我认为JavaFX的设计方式是相关的:D。可能是因为我缺乏客户端技术方面的经验。谢谢你的澄清:)@Itachiunchha:谢谢你的回复你非常清楚地理解了我的问题并回答了它,虽然可能是“kleopatra”的最佳答案,可以使用
TraversalEngine
,但你的答案正是我要找的。