Javafx 使用自定义控件分配Label.setLabelFor(节点)

Javafx 使用自定义控件分配Label.setLabelFor(节点),javafx,label,custom-controls,Javafx,Label,Custom Controls,我编写了一个简单的自定义控件,它扩展了HBox,并包含一个TextField和按钮。对于许多控件来说,在描述其用途的同时添加一个标签是有意义的,我希望支持助记功能的平台上的用户能够轻松访问该控件,更具体地说,将重点放在按钮实例上 我的第一个想法是为自定义控件分配一个焦点侦听器,假设目标节点将集中在标签激活上,但这不起作用。在深入研究JavaFX源代码时,我发现Label.labelForProperty()使用了NodeHelper$NodeAccessor.setLabeledBy(Node,

我编写了一个简单的自定义控件,它扩展了HBox,并包含一个
TextField
按钮。对于许多控件来说,在描述其用途的同时添加一个标签是有意义的,我希望支持助记功能的平台上的用户能够轻松访问该控件,更具体地说,将重点放在按钮实例上

我的第一个想法是为自定义控件分配一个焦点侦听器,假设目标节点将集中在标签激活上,但这不起作用。在深入研究JavaFX源代码时,我发现
Label.labelForProperty()
使用了
NodeHelper$NodeAccessor.setLabeledBy(Node,Node)
方法,但无法超越它,因为我找不到
NodeHelper$NodeAccessor
接口的可靠实现。我的猜测是,这个实用程序类只映射与它认为合适的目标的关联,而由于某些原因,我的自定义控件不适合

我的第二个想法是打开对按钮的访问,然后可以将其直接指定为目标,但由于明显的原因,这是一个糟糕的选择,我更愿意让按钮无法访问


是否有人遇到过这种情况,并在不影响自定义控件内部实现细节可见性的情况下找到了可行的解决方案/解决方案?

这是一个简单的解决方案,不需要您的
按钮
来实现
的可见性:

public class YourCustomClass {
    private TextField tf;
    private Button btn;

    public void registerLabel(Label label) {
        label.setLabelFor(btn);
    }
}

这是一个简单的解决方法,不需要您的
按钮
就具有
公共
可见性:

public class YourCustomClass {
    private TextField tf;
    private Button btn;

    public void registerLabel(Label label) {
        label.setLabelFor(btn);
    }
}

谢谢这或多或少是我在生产代码中采用的变通方法,但不知何故,我还是觉得有点“笨拙”。不过,至少它起作用了,毕竟这是主要目的;这或多或少是我在生产代码中采用的变通方法,但不知何故,我还是觉得有点“笨拙”。不过,至少它起作用了,毕竟这是主要目的。