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