JavaFX - 在自定义节点上设置focusedProperty Listener

时间:2018-06-16 17:54:43

标签: java javafx listener custom-controls

我有一个我自己制作的自定义TimePicker节点,它主要工作,但我需要能够添加一个侦听器来检查它何时获得焦点或失去焦点。问题是它没有检测到我什么时候专注于它。

public class TimePicker extends HBox {
    private NumberField nbxH; // NumberField is a custom class that extends Textbox. `focusedProperty().addListener` works as expected for this node.
    private Label lblColon;
    private NumberField nbxM;
    private Button btnAmPm;

    public TimePicker() {
        // for testing
        this.focusedProperty().addListener((observable, oldValue, newValue) -> {
            printDebug("--TIME PICKER FOCUSED PROPERTY-------------------------"
                    + "\n" + observable 
                    + "\n" + oldValue 
                    + "\n" + newValue 
                    );
        });

        nbxH = new NumberField();
        /* nbxH setup */

        lblColon = new Label(":");

        nbxM = new NumberField();
        /* nbxM setup */

        btnAmPm = new Button("AM");
        /* btnAmPm setup */
    }

    /* other methods */
}

在班级本身,我可以检查每个孩子是否都集中注意力。我想添加一个监听器来检查是否有任何一个孩子是聚焦的,或者是否没有孩子聚焦。换句话说,如果任何一个孩子都集中注意力,那么isFocused就是true,如果他们都没有集中注意力,那么isFocused就是false;我可以设置一个监听器来检查是否要改变。问题是,isFocused设置为final,不能被覆盖。

1 个答案:

答案 0 :(得分:0)

我明白了。对于每个子元素添加一个侦听器,该侦听器检查是否有任何元素被聚焦,并将父对象的焦点设置为结果。一旦我意识到setFocused是一个选项,这就变得非常明显了。

nbxM.focusedProperty().addListener((observable, oldValue, newValue) -> {
    this.setFocused(nbxH.isFocused() | nbxM.isFocused() | btnAmPm.isFocused());
});