当前位置: 首页 > 知识库问答 >
问题:

TextField requestFocus丢失第一个键?(JavaFX2)

吴举
2023-03-14

我在AnchorPane中嵌入了一个TextField和几个按钮。默认情况下,TextField没有焦点,因为我希望它显示提示文本(请参见JavaFX2的TextField中的prompttext在一些Java7更新后隐藏在焦点上--这似乎是一个已知的问题)。我希望TextField在用户按下ENTER或Escape以外的任何键时接收焦点。我创建了一个EventHandler,它附加到我的AnchorPane.setonKeyPressed()(和按钮的onKeyPressed监听器),它在键盘事件上运行一个开关,默认值为:

                    default:
                    Platform.runLater(new Runnable() {
                        @Override
                        public void run() {
                            myTxt.requestFocus();
                            myTxt.fireEvent(event);
                        }
                    });

这确实将焦点发送到TextField;但是,我按下的键实际上并没有显示在TextField中。换句话说,如果我键入

test

TextField将接收焦点,但仅

est
Oct 29, 2013 2:22:11 PM com.myapp.AppMainController$4 handle
INFO: Got key t at source Button[id=myBtn, styleClass=button]
Oct 29, 2013 2:22:11 PM com.myapp.AppMainController$6 handle
INFO: Got key t at source TextField[id=myTxt, styleClass=text-input text-field]

编辑1:我应该澄清的是,无论焦点是从窗格还是按钮切换到TextField都会发生这种情况。

编辑2(解决方案):实际问题是“platform.runlater”包装器。如果我只是请求焦点而不是“runlater”,我的关键事件就会像我预期的那样出现。

                    default:
                        myTxt.requestFocus();

共有1个答案

昌乐生
2023-03-14

我不知道你的上下文是什么样子的,但我是这样解决的

public class Main extends Application {
    @Override
    public void start(Stage stage) {        
        final VBox vbox = new VBox();
        vbox.setSpacing(5);
        vbox.setPadding(new Insets(10, 0, 0, 10));

        final TextField textField = new TextField();
        final Button button = new Button();

        vbox.getChildren().addAll(textField, button);


        vbox.onKeyPressedProperty().set(new EventHandler<KeyEvent>() {
            @Override public void handle(KeyEvent event) {
                textField.requestFocus();
            }
        });

        stage.setScene(new Scene(vbox, 300, 500));
        stage.show();
    }

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

重要的部分是

vbox.onKeyPressedProperty().set(new EventHandler<KeyEvent>() {
    @Override public void handle(KeyEvent event) {
        textField.requestFocus();
    }
});

通过使用keyPressedProperty,它将在您按下任意按钮时激活,而不是在您键入/释放按钮时激活。与首都和非首都一起工作。

this.setOnMouseClicked(new EventHandler<MouseEvent>() {
    @Override
    public void handle(MouseEvent paramT) {
        Platform.runLater(new Runnable() {
            @Override public void run() {
                if (isFocused() && !getText().isEmpty()) {
                    selectAll();
                }               
            }
        });
    }
});
 类似资料:
  • 我正在尝试从 kafka 主题中获取消息,并看到如果我将 auto.commit.reset 策略设置为“最早”,则所有消息都会得到正确处理。但是,如果设置为“最新”,则第一条消息将丢失,其余消息将得到正确处理。如果我在这里错过了什么,任何人都可以帮忙吗?

  • 下面是HashMap中包含的值 获取第一个键(即活动键)的Java代码 我们如何收集第一个键“值”(即33),我想把“键”和“值”都存储在单独的变量中。

  • 我有需要与两个反应性依赖项交互的代码——保存到数据库和发布到流,每个都返回实例。在这之后,我需要做更多的处理——所有这些都使用我开始时的原始对象,类似这样: 但问题是,不会返回我感兴趣的对象的,也不会返回。 我可以实现我想要的东西,比如: i、 e.映射到依赖函数只是为了得到它们的行为,然后再直接映射回来,但这似乎很奇怪-好像我可能缺少了更好的方法来使用API,它没有给出我在类型之间映射的提示,因

  • 问题内容: 我今天犯了升级Eclipse的错误,现在无法启动新的Android项目。 我收到消息Proguard.cfg(找不到文件)。 我似乎在哪里找不到这东西?是否有可能摆脱它我在这个项目中不需要混淆… 谢谢 问题答案: 如果您确实不需要Proguard来混淆发行版,则可以从项目根文件夹的default.properties文件中删除以下行: proguard.config = proguar

  • 我将获取一个用户列表作为数组,对数据进行分页,并以表格的形式显示在视图中。 为了迭代数组,我使用 foreach 循环。但是我的前循环迭代不起作用。 这是一个示例数组,当我执行< code>print_r()时,我有< code>id、< code>email和< code>full_name字段,我想在视图中显示它们 这是我迭代数组的视图部分。结果存储在< code>$userList中。这个数