在构造函数中泄漏这个 - 在哪里正确添加监听器和其他需要"this"的方法

che*_*ral 7 java swing

我有一个扩展JPanel的类.在它的构造函数中,我将传递this给其他方法,主要是将jpanel对象添加为jpanel(以及其他对象)中的容器/控件的侦听器.由于Netbeans leaking this in constructor对这些调用显示警告,我将它们放在从构造函数调用的其他方法中.

之前:

class Foo ... {
    public Foo() {
      initComponents();
      tabX.addChangeListener(this); // <- netbeans complains here
    }
Run Code Online (Sandbox Code Playgroud)

后:

class Foo ... {
    public Foo() {
      initComponents();
      initListeners();
    }

    protected void initListeners() {
      tabX.addChangeListener(this);
    }
Run Code Online (Sandbox Code Playgroud)

这摆脱了症状.但我怀疑它解决了netbeans显示警告的原因.
在JPanel派生类中进行这种初始化的适当位置在哪里?

Cod*_*ind 0

我假设您可能将JPanel扩展添加到其他一些组件(例如JFrame,,JApplet另一个JPanel,等等)。您提到您需要将面板添加到该面板内的子组件和面板需要侦听的“其他对象”之间存在一些混合。最好将面板添加到您将JPanel扩展添加到其封闭JFrame组件或其他父组件的位置附近的那些“其他对象”,在扩展的类定义之外。

但是,对于面板必须侦听的面板子组件,我认为您所做的很好,前提是这些子组件对JPanel扩展类定义之外的对象不可见。该警告只是表明您正在做的事情可能不安全,但最终,当您的面板被垃圾收集时,它拥有的所有子组件也将被垃圾收集,包括它们维护的任何侦听器列表。你的JPanel分机。因此,我认为将调用放入扩展add*Listener(this)的适当命名的私有方法中JPanel并从构造函数中调用它是可以的。

另一种选择是使用 Eclipse,这样您就不会再收到这些警告了...(完全是在开玩笑;)。