我有一个自定义的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 */
}


在上课时,我可以检查每个孩子是否专注。我想添加一个侦听器,以检查是否有任何一个孩子被关注或没有一个孩子被关注。换句话说,如果任何一个子项都被关注,则isFocusedtrue;如果它们都不被关注,则isFocusedfalse;并且我可以设置一个监听器来检查它是否改变。问题是isFocused设置为final并且不能被覆盖。

最佳答案

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

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

10-07 12:39
查看更多