Создание нескольких экземпляров объекта с одной и той же переменной в Java

У меня есть немодальный диалог, в котором мне нужно показать несколько экземпляров, отображаемых одновременно. Я сохранил диалог как переменную-член в новом классе и показываю диалог. Здесь видно несколько экземпляров диалога, но я назначаю его одной и той же переменной-члену (мне нужно, чтобы она была переменной-членом для некоторой обработки). Он работает нормально, но я не понимаю, почему это работает. Я пропустил что-то очень очевидное?

public class ABC {
    CMyDialog m_dlg;

    onSomeEvent() {
       m_dlg = new CMyDialog();
    }
}

onSomeEvent вызывается несколько раз и отображается несколько диалогов. Есть идеи, как Java управляет этими вещами? Нужно ли мне хранить массив CMyDialog в качестве переменной-члена вместо одного класса?

Любая помощь высоко ценится.

Заранее спасибо. Нитин К.


person Nitin Kale    schedule 03.04.2011    source источник
comment
Я пропустил что-то очень очевидное?: Ага... несколько согласных и гласных тут и там...   -  person thkala    schedule 03.04.2011
comment
спасибо за уведомление.. :)   -  person Nitin Kale    schedule 03.04.2011


Ответы (2)


Хотя видим несколько экземпляров диалога, каждый из них занимает отдельное место в основной памяти. Имя переменной может быть одинаковым, но все экземпляры диалога не используют одну и ту же память. Надеюсь, это то, о чем вы просили.

person Shankar Raju    schedule 03.04.2011
comment
Спасибо Шанкар за ответ. Так ты имеешь в виду, что мне не нужно делать ничего особенного, чтобы справиться с этой ситуацией. Под особым я подразумеваю сохранение массива открытых диалогов и тому подобного. Правильно ли предположить, что Java управляет этим самостоятельно? - person Nitin Kale; 03.04.2011
comment
@Nitin Kale, насколько я знаю, в вашем случае вам не нужно создавать какие-либо массивы. Создавайте массив, только если вы хотите использовать эту ссылку для какой-либо цели. Если вам просто нужно, чтобы диалоговое окно всплывало, и в фоновом режиме происходят некоторые события пользовательского интерфейса, вам не нужно поддерживать отдельное имя для каждой ссылки. - person Shankar Raju; 03.04.2011
comment
Я отмечаю, что вы говорите, что мне нужно иметь его как переменную-член для некоторой обработки. Только последний созданный диалог будет доступен для переменной-члена, поэтому, вероятно, ваша обработка будет нарушена в других диалогах. - person Simon G.; 03.04.2011
comment
спасибо Саймон за ваш вклад. Я проверю, доставляет ли это какие-либо проблемы. - person Nitin Kale; 03.04.2011

операция закрытия по умолчанию для JDialog есть HIDE_ON_CLOSE. Если вам не нужно несколько диалоговых окон, вы можете создать только одно и сделать его видимым onSomeEvent(). В этом примере используется обработчик itemStateChanged() кнопки-переключателя.

import java.awt.EventQueue;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.*;

/** @see http://stackoverflow.com/questions/5528408 */
public class DialogToggle extends JPanel {

    private static final String show = "Show Dialog";
    private static final String hide = "Hide Dialog";
    MyDialog myDialog = new MyDialog();

    public DialogToggle() {
        final JToggleButton b = new JToggleButton(show);
        b.addItemListener(new ItemListener() {

            @Override
            public void itemStateChanged(ItemEvent e) {
                if (b.isSelected()) {
                    myDialog.setVisible(true);
                    b.setText(hide);
                } else {
                    myDialog.setVisible(false);
                    b.setText(show);
                }
            }
        });
        this.add(b);
    }

    private class MyDialog extends JDialog {

        public MyDialog() {
            this.setLocationRelativeTo(DialogToggle.this);
            this.add(new JLabel("Hello, world!", JLabel.CENTER));
        }
    }

    private void display() {
        JFrame f = new JFrame("ABC");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(this);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new DialogToggle().display();
            }
        });
    }
}
person trashgod    schedule 03.04.2011
comment
Спасибо TrashGod за ответ. Что я делаю, так это то, что вместо создания объекта myDialog в объявлении класса ABC я просто объявляю его как начальное значение null (CMyDialog myDialog = null;//new CMyDialog();) и в обработчике actionPerformed() я просто создание новых объектов CMyDialog, т.е. myDialog = new CMyDialog(); Теперь мой вопрос: при многократном нажатии кнопки создается несколько диалогов, но хорош ли этот метод? или мне нужно управлять экземплярами CMyDialog в массиве или что-то в этом роде? - person Nitin Kale; 03.04.2011
comment
Хорошо это или плохо зависит от цели. Не загромождают ли экран лишние диалоги? Если вы их закрываете, вам, вероятно, следует сделать setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE) в конструкторе диалогового окна. - person trashgod; 03.04.2011