在询问之前,我应该说可以在JavaFX: How to change the focus traversal policy?中找到答案,但我不寻找任何java代码,我想通过编辑Fxml文件的方式
有一个FXML文件中包含一些TextFields,我想更改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中包装两个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 - &gt; ID1 - &gt; ID3 - &gt; ID4 - &gt; ID5 - &gt; ID5 !!! )
所以!?!?当用户单击TAB时,如何更改TextField的焦点遍历。
看起来如果你只有一个anchorPane它很容易,但如果你有HBox它从右侧开始到左侧。
默认情况下,当按下Tab键时,焦点移动(右侧病房)到下一个组件,但正如我所说,我想要从左到右!!
有没有解决方案?
答案 0 :(得分:2)
有多种方法可以实现所述行为。一个非常简单的技术是在TextFields的Parent上使用NodeOrientation,以及在Parent中对它进行排序。
我重新编写了代码以使其更易于维护。为了更好地理解,可以注意以下几点:
RIGHT_TO_LEFT
id1
而不是id2
,这使得它成为加载场景时首先关注的元素<强> 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>