【问题标题】:How to focus a specific node when selected tab changes in JavaFX?JavaFX中选定选项卡更改时如何聚焦特定节点?
【发布时间】:2014-01-02 20:19:46
【问题描述】:

我想将焦点设置到选项卡内容中的特定节点。我向 selectedItem 属性添加了一个 ChangeListener,如下所示(假设该类包含一个名为 secondNode 的字段,类型为 Node ):

tabPane.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Tab>() {
    @Override
    public void changed(ObservableValue<? extends Tab> observable, Tab oldValue, Tab newValue) {
        if (newValue != null) {
            Platform.runLater(new Runnable() {
                @Override
                public void run() {
                    secondNode.requestFocus();
                }
            });
        }
    }
});

但是,这不起作用。我认为原因是因为 TabPane 在选择新选项卡后执行了一些影响焦点的附加操作(但是,通过 TabPane source code,我不知道是什么)。如果我在调试器中单步执行此代码,它会按预期工作,因此它似乎是一个竞争条件。如果是这样,如何解决?

【问题讨论】:

    标签: java javafx-2


    【解决方案1】:

    您可以尝试用任务替换 Runnable:

            new Thread( new Task<Void>() 
            {
                @Override
                public Void call() throws Exception // This is NOT on FX thread 
                {
                    Thread.sleep(100);
                    return null;
                }
    
                @Override
                public void succeeded()  // This is called on FX thread.
                {
                    secondNode.requestFocus();
                }
    
            }).start();
    

    【讨论】:

    • 嗯,这毫无疑问会起作用,但这取决于线程休眠的时间。如果您设置的值太低,您仍然可能会出现竞争条件,如果该值太高,则会出现明显的焦点转移。所以这是一种骇人听闻的解决方案。不过,这是一个解决方案,所以我会接受它。
    • 是的,我同意它的骇人听闻,但不幸的是,我不得不多次使用这种技术来处理 FX 的其他方面。我希望它在 FX 8 中会更好。
    • 如你所说,这是错误的,我认为这应该作为一个错误报告给 OpenJavaFX。
    猜你喜欢
    • 1970-01-01
    • 2015-12-04
    • 1970-01-01
    • 2011-04-27
    • 2015-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-08
    相关资源
    最近更新 更多