2012-09-27 113 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);'必须是构造函数中的最后一行代码,否则显示'empty container' – mKorbel

+1

确实,'setVisible(true)'应该是构造函数中的最后一行代码,否则您会注意到在控件显示的延迟,但在这种情况下,问题是'JDialog'的'getContentPane()'调用(通过测试确认) – higuaro

+0

omg lol现在它工作...我不知道这个:D谢谢 – tmh

0

删除在JDialog版本getContentPane()调用,它应该工作