【问题标题】:Focus Listener for JavaFX NodesJavaFX 节点的焦点侦听器
【发布时间】:2014-03-14 22:12:21
【问题描述】:

我是 JavaFX 的初学者。我真的被困在这一点上。 :( 如果我的英语不好,对不起。

我的 JavaFX 程序中有两个堆栈窗格。我想为这两个堆栈窗格添加一个焦点侦听器。

应该这样,当我单击一个堆栈窗格时,它应该激活此堆栈窗格的焦点获取方法。

一旦我单击另一个堆栈窗格,第一个堆栈窗格应该调用它的焦点丢失方法,并且应该调用当前堆栈窗格的焦点获取方法。就像我们在 Swing 包中有焦点事件一样。

目前我已经尝试过:

stackPane.focusedProperty().addListener(new ChangeListener<Boolean>() {

                @Override
                public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
                    if (newValue.booleanValue()) {
                        focusGained(stackPane);
                    } else {
                        focusLost(stackPane);
                    }
                }
            });

private void focusGained(StackPane stackPane){
    System.out.println("Focus Gained.");
}

private void focusLost(StackPane stackPane){
    System.out.println("Focus Lost.");
}

我还尝试在堆栈窗格上设置焦点可遍历属性,即

stackPane.setFocusTraversable(true);

这些都不能正常工作。当我运行它时,无论我点击堆栈窗格多少次,输出都只显示这 3 行。

Focus Gained.
Focus Lost.
Focus Gained.

请帮忙。

【问题讨论】:

标签: java swing javafx


【解决方案1】:

嗯,有点晚了,但它可能会帮助其他人。 这工作正常:

root.focusedProperty().addListener((ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) -> {
    focusState(newValue);
});

private void focusState(boolean value) {
    if (value) {
        System.out.println("Focus Gained");
    }
    else {
        System.out.println("Focus Lost");
    }
}

【讨论】:

  • @Tunaki ...只是出于好奇,您编辑了我的答案,但我发现我的回答没有任何变化。你到底编辑了什么?
  • 我修正了答案的缩进级别:你只需要 4 个空格来格式化为代码。
猜你喜欢
  • 1970-01-01
  • 2013-12-25
  • 2017-05-08
  • 1970-01-01
  • 2014-08-21
  • 2013-11-30
  • 1970-01-01
  • 1970-01-01
  • 2021-05-03
相关资源
最近更新 更多