Создание нескольких экземпляров объекта с одинаковой переменной в Java
У меня есть немодальное диалоговое окно, которое мне нужно, чтобы показать несколько экземпляров, отображаемых одновременно. Я сохранил диалог как переменную-член в классе, который я новый и показываю диалог. Здесь есть несколько видимых экземпляров диалога, но я присваиваю его одной и той же переменной-члену (мне нужно иметь его в качестве переменной-члена для некоторой обработки). Это работает нормально, но я не понимаю, почему это работает. Я скучаю по чему-то очень очевидному?
public class ABC {
CMyDialog m_dlg;
onSomeEvent() {
m_dlg = new CMyDialog();
}
}
onSomeEvent
вызывается несколько раз, и отображаются несколько диалогов. Есть идеи, как Java управляет этими вещами? Мне нужно сохранить массив CMyDialog в качестве переменной-члена, а не только один класс?
Любая помощь высоко ценится.
Заранее спасибо. Нитин К.
2 ответа
Хотя есть несколько видимых экземпляров диалога, каждый из них занимает отдельное место в основной памяти. Имя переменной может быть одинаковым, но все экземпляры диалога не разделяют одну и ту же память. Я надеюсь, что это то, что вы просили.
Операция закрытия по умолчанию для 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://stackru.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();
}
});
}
}