2012-09-27 2 views
1

У меня странная проблема с классом, который простирается 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).

Пожалуйста, помогите :)

ответ

4

Просто переместите setVisible(true); звонок в конце вашего конструктора.

+1

@tmh 'setVisible (true);' должна быть последней строкой кода в конструкторе, иначе вы показывали 'пустой контейнер' – mKorbel

+1

Действительно,' setVisible (true) 'должен быть последней строкой кода в конструкторе, иначе вы заметите задержка в отображении элементов управления, но в этом случае проблема заключается в 'getContentPane()' вызове для 'JDialog' (подтверждено тестом) – higuaro

+0

omg lol теперь это работает ... Я не знал об этом: D благодаря – tmh

0

Удалите getContentPane() заклинаниям в версии JDialog, он должен работать

 Смежные вопросы

  • Нет связанных вопросов^_^