У меня странная проблема с классом, который простирается JDialog:JDialog не показывает компоненты
class MyDialog extends JDialog {
private static final long serialVersionUID = 11564288421L;
public MyDialog(JFrame owner, MyObject object) {
super(owner, true);
setSize(300, 200);
setLocationRelativeTo(owner);
String title = "Object ID: " + object.getId();
setTitle(title);
setVisible(true);
JLabel lblTitle = new JLabel(title);
lblTitle.setBounds(0, 0, this.getWidth(), 22);
lblTitle.setFont(new java.awt.Font("Tahoma", 1, 18));
lblTitle.setHorizontalAlignment(SwingConstants.CENTER);
getContentPane().setLayout(null);
getContentPane().add(lblTitle);
}
}
Когда я называю его new MyDialog(existingJFrameInstance, existingMyObjectInstance);
, MyDialog
отображается и хорошо названием, но нет ничего в его ContentPane
,
Если изменить класс на:
class MyDialog extends JFrame {
private static final long serialVersionUID = 11564288421L;
public MyDialog(JFrame owner, MyObject object) {
super();
setSize(300, 200);
setLocationRelativeTo(owner);
String title = "Object ID: " + object.getId();
setTitle(title);
setVisible(true);
JLabel lblTitle = new JLabel(title);
lblTitle.setBounds(0, 0, this.getWidth(), 22);
lblTitle.setFont(new java.awt.Font("Tahoma", 1, 18));
lblTitle.setHorizontalAlignment(SwingConstants.CENTER);
getContentPane().setLayout(null);
getContentPane().add(lblTitle);
}
}
Все работает просто отлично. Я не могу себе представить, что здесь происходит: \
Мне нужно, чтобы окно было модальным, поэтому я должен пойти с JDialog
вместо JFrame
.
Я попытался с помощью this.pack();
, this.validate();
, getContentPane().revalidate();
, getContentPane().repaint();
и т.д. и т.п. и т.д. в каждой возможной комбинации, и я нахожусь в EDT (SwingUtilities.isEventDispatchThread()
возвращается true
).
Пожалуйста, помогите :)
@tmh 'setVisible (true);' должна быть последней строкой кода в конструкторе, иначе вы показывали 'пустой контейнер' – mKorbel
Действительно,' setVisible (true) 'должен быть последней строкой кода в конструкторе, иначе вы заметите задержка в отображении элементов управления, но в этом случае проблема заключается в 'getContentPane()' вызове для 'JDialog' (подтверждено тестом) – higuaro
omg lol теперь это работает ... Я не знал об этом: D благодаря – tmh