Создание нескольких экземпляров объекта с одинаковой переменной в Java - PullRequest
1 голос
/ 03 апреля 2011

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

public class ABC {
    CMyDialog m_dlg;

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

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

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

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

Ответы [ 2 ]

1 голос
/ 03 апреля 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();
            }
        });
    }
}
0 голосов
/ 03 апреля 2011

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

...