2012-09-27 82 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()調用,它應該工作