0

问题:
让 tabPane 选项卡正常。
在第一个选项卡中有一个文本字段。启动应用程序时,我能够专注于该领域。更改选项卡并返回第一个选项卡后,我希望将焦点放在此文本字段上(条形码阅读器应在此字段中处于活动状态),而不必用鼠标选择该字段。

我可以从标签中捕获事件

 tp.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Tab>()
   { etc

(无法发布代码)

我能够为第一个选项卡触发事件。但是 field.requestFocus(); 不起作用。可能是因为此方法出现在呈现文本字段之前。

所以这是我的问题:

单击 TabPane 中的选项卡后如何将焦点设置在控件上?

4

2 回答 2

1

如果您处理鼠标释放事件,它会起作用:(doFocus 仅在选项卡选择之前更改时启用 requestFocus 处理,否则每次单击 TabPane 中的某个位置时它都会启动。)

    final SimpleBooleanProperty doFocus = new SimpleBooleanProperty(false);
    tabPane.setOnMouseReleased(new EventHandler<Event>() {
        @Override
        public void handle(Event event) {
            if (!doFocus.get()) {
                return;
            }
            doFocus.set(false);
            switch (tabPane.selectionModelProperty().getValue().selectedIndexProperty().intValue()) {
            case 0: tf1b.requestFocus(); break;
            case 1: tf2a.requestFocus(); break;
            default: break;
            }
        }
    });
    tabPane.selectionModelProperty().getValue().selectedIndexProperty().addListener(new ChangeListener<Number>() {
        @Override
        public void changed(ObservableValue<? extends Number> observable,
                Number oldValue, Number newValue) {
            doFocus.set(true);
        }
    });

当 TabPane 具有焦点时,可以使用光标键更改选项卡选择,并且 TextFields 也不会通过基于选择的方法获得焦点。如果您需要,这可能也应该处理。

(最近我遇到了类似的问题。我注意到,当您按下鼠标按钮时,TabPane 会立即切换选项卡。我的猜测是,基于选择的方法请求在鼠标按下后立即关注 TextField,但继续按下鼠标会窃取焦点回到 TabPane。或者甚至可能改变选择的单个鼠标按下事件导致焦点回到 TabPane。但是,我对原因的假设可能不正确,因为我是 JavaFX 的新手。)

编辑:这种处理当然不是最佳的。例如,如果您使用键更改选项卡,doFocus 将被启用,然后单击 TabPane 中的任意位置将触发 requestFocus 调用。我认为应该提到这一点。

于 2013-03-26T22:28:10.310 回答
0

另外,当用户更改所选选项卡(使用鼠标或键盘) https://stackoverflow.com/a/19046535/2791746时,请查看我在 TextArea 上设置焦点的解决方案

于 2013-09-27T08:53:37.477 回答