通过fxml文件

时间:2015-05-07 07:03:22

标签: java javafx javafx-8 scenebuilder keyboardfocusmanager

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

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

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

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

enter image description here

为此,我改变了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 !!! )

enter image description here

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

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

默认情况下,当按下Tab键时,焦点移动(右侧病房)到下一个组件,但正如我所说,我想要从左到右!!

有没有解决方案?

1 个答案:

答案 0 :(得分:2)

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

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

  • 而不是1,我使用的是VBox中包含的4个HBox
  • 根据需要,每个HBox都有一个/两个TextFields。它可能包含两个以上
  • 每个HBox的nodeOrientation为RIGHT_TO_LEFT
  • 第一个HBox的第一个元素是TextField id1而不是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>