Как исправить предупреждение "Утечка в конструкторе"

Возможный дубликат:
Java - Утечка в конструкторе

В NetBeans у меня есть JDialog, который содержит JPanel. Я пытаюсь передать ссылку на JDialog в JPanel. Пожалуйста, посмотрите на мой код ниже. Когда я делаю это так, как я, я получаю предупреждение "Утечка в конструкторе". Я понимаю почему, но я не знаю, как это исправить. Я также знаю, что могу использовать @SuppressWarnings("LeakingThisInConstructor"), но разве нет реального способа исправить это, не подавив предупреждение?

public class MyJDialog extends javax.swing.JDialog {

    public MyJDialog(java.awt.Frame parent, boolean modal) {
        super(parent, modal);
        initComponents();
        MyJPanel.getThis(this);
    }
}

public class MyJPanel extends javax.swing.JPanel {

    private JDialog dialog;

    public MyJPanel() {
        initComponents();
    }

    public void getThis(JDialog dialog){
        this.dialog = dialog;
    }
}

3 ответа

Решение

Конструктор вернет ссылку на диалог. Сделайте так, чтобы панель сама установила переменную после создания экземпляра.

public class MyJPanel extends JPanel {
  private JDialog dialog;

  public MyJPanel(Frame aFram) {
    dialog = new MyJDialog(aFrame, true);
  }
}

Кроме того, этот код не будет работать, потому что getThis() не является статическим методом, поэтому требует ссылки на MyJPanel пример.

Если я вас правильно понимаю, JDialog создает экземпляр JPanel. В этом случае вы можете передать ссылку на JDIalog через конструктор JPanel.

В классе MyJPanel:

  public MyJPanel(JDialog dialog) {
    initComponents();
    this.dialog = dialog;
  }

И в JDialog в точке, где вы создаете MyJPanel, вы можете сделать это:

  myPanel = new MyJPanel(this);

Вы можете придерживаться @SuppressWarnings("LeakingThisInConstructor"), потому что все объекты пользовательского интерфейса создаются в одном потоке в приложении Swing, поэтому нет проблем для передачи this на последней строке констурктора компонента Swing.

Другие вопросы по тегам