gpt4 book ai didi

输入字符后 JavaFX 将焦点转移到 TextField

转载 作者:行者123 更新时间:2023-12-01 12:45:19 25 4
gpt4 key购买 nike

背景

我正在创建一个 JavaFX 表单,要求用户输入 IP 地址。我的设计当前使用四个 TextField,而不是单个 TextField,每个地址对应一个字节。我的意图是,一旦用户在一个字段中输入了三个字符,焦点应该自动跳转到下一个。

问题

当用户键入第三个字符时,焦点仍保留在文本字段中。当他们输入第四个字符时,他们输入的字符将被放置在字段的开头(而不是结尾),然后焦点将更改到下一个字段。我的处理程序方法是否犯了错误?我应该响应不同的事件吗?

查看

<FlowPane fx:id="paneIPAddress" fx:controller="Controller" alignment="CENTER">
<children>
<TextField fx:id="textIP1" alignment="CENTER" onKeyTyped="#ip1Change" prefWidth="40.0" />
<Label text=".">
<font>
<Font name="SansSerif Bold" size="18.0" />
</font>
</Label>
<TextField fx:id="textIP2" alignment="CENTER" onKeyTyped="#ip2Change" prefWidth="40.0" />
<Label text=".">
<font>
<Font name="SansSerif Bold" size="18.0" />
</font>
</Label>
<TextField fx:id="textIP3" alignment="CENTER" onKeyTyped="#ip3Change" prefWidth="40.0" />
<Label text=".">
<font>
<Font name="SansSerif Bold" size="18.0" />
</font>
</Label>
<TextField fx:id="textIP4" alignment="CENTER" prefWidth="40.0" />
</children>
<VBox.margin>
<Insets bottom="25.0" />
</VBox.margin>
</FlowPane>

Controller

public class Controller {

public void ip1Change() {
if (textIP1.getText().length() >= 3) {
textIP2.requestFocus();
}
}

public void ip2Change() {
if (textIP2.getText().length() >= 3) {
textIP3.requestFocus();
}
}

public void ip3Change() {
if (textIP3.getText().length() >= 3) {
textIP4.requestFocus();
}
}
}

最佳答案

最好避免使用按键事件监听器来管理此问题(例如,如果用户使用鼠标复制和粘贴文本会发生什么情况)。相反,使用文本字段的文本属性注册监听器。

此示例不使用 FXML,但您可以在 Controller 的初始化方法中执行完全相同的操作:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;

public class IPAddressEntry extends Application {

@Override
public void start(Stage primaryStage) {
TextField ipAdd1 = new TextField();
TextField ipAdd2 = new TextField();
TextField ipAdd3 = new TextField();
TextField ipAdd4 = new TextField();

registerListener(ipAdd1, ipAdd2);
registerListener(ipAdd2, ipAdd3);
registerListener(ipAdd3, ipAdd4);

GridPane root = new GridPane();
root.addRow(0, ipAdd1, ipAdd2, ipAdd3, ipAdd4);

Scene scene = new Scene(root, 250, 50);
primaryStage.setScene(scene) ;
primaryStage.show();
}

private void registerListener(TextField tf1, TextField tf2) {
tf1.textProperty().addListener((obs, oldText, newText) -> {
if (oldText.length() < 3 && newText.length() >= 3) {
tf2.requestFocus();
}
});
}

public static void main(String[] args) {
launch(args);
}
}

关于输入字符后 JavaFX 将焦点转移到 TextField,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24763051/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com