2010-12-20 20 views
2

通常,setBounds()方法將被調用對象定位在指定的位置和指定的大小。 我創建了一個JFrame類,並使用setLayout(null)設置了一個按鈕。 然後我創建了一個擴展JPanel並在其中放置一些組件的類。 這些組件的邊界在方法內部設置。 該類的一個對象包含在擴展JFrame的類中。 然後這個對象調用setBound()方法。 但是結果並未顯示JPanel擴展類中的組件。下面給出了cde片段。爲什麼setBounds()方法即使在將setLayout()設置爲null之後也不起作用?

class Administrator extends JFrame implements ActionListener 
{ 
    public Administrator() 
    { 
    setTitle("Administration"); 
    setSize(500,500); 
    setDefaultCloseOperation(EXIT_ON_CLOSE); 
    setLayout(null);  
    JButton newbutton=new JButton(" New.. "); 
    newbutton.addActionListener(this); 
    add(newbutton); 
    newbutton.setBounds(100,100,100,25); 
    setVisible(true); 

    public static void main(String arg[]) 
    { 
     new Administrator(); 
    } 

    public void actionPerformed(ActionEvent ae) 
    { 
    String act=(String)ae.getActionCommand(); 
    if(act.equals("New Registry..")||act.equals(" New.. ")) 
    { 
     regPanel rgpnl=new regPanel(); 

     Dimension sz; 
     sz=rgpnl.getPreferredSize(); 
     rgpnl.setBounds(800,800,sz.width,sz.height);  
     rgpnl.arrangeComponents(); 
     add(rgpnl); 


     repaint(); 
     setVisible(true); 
    } 
} 
class regPanel extends JPanel 
{ 
    Label namelab; 
    JTextField name; 
    JButton do_register; 
    public regPanel() 
    { 
    //Container = get(); 
    setLayout(null); 

    namelab=new Label("Name :"); 
    name=new JTextField(20); 
    add(namelab); 
    add(name); 
    add(do_register); 
    } 
    public void arrangeComponents() 
    { 
    Dimension size; 

    size=namelab.getPreferredSize(); 
    namelab.setBounds(20,10,size.width,size.height); 
    name.getPreferredSize(); 
    name.setBounds(150,10,size.width,size.height); 
    do_register.setBounds(10,10,size.width,size.height); 

    repaint(); 

    }  
}  
+0

您在代碼中缺少一些''''和導入,使它真正實現了粘貼編譯運行。 – 2010-12-20 16:08:26

回答

6

除了你的代碼的一些可疑的部分 - 就像缺少大括號,空指針和這樣的錯誤 - 你在代碼(800800)創建的組件,而接口只有500×500大小像素。這會將組件置於視野之外。將組件放在距窗口原點較小的偏移處,並顯示出來。 (我對此進行了測試,並對代碼進行了一些修改,例如撥打setLayout(null)時的調用順序,這個調用應該看起來是在正確的時間發生的,否則這些組件不會顯示給我。)

3

這可能不是您想要聽到的答案,但避免使用空佈局和絕對位置會更好,因爲它可能是一個需要維護的東西,並且如果在其他操作系統上運行,可能會使您的GUI變得難看或不可用而不是它開發的那個。大多數GUI甚至是相當複雜的GUI都可以通過使用簡單的佈局管理器嵌套JPanel來實現,或者禁止GridBagLayout或MIgLayout(不是標準Java的一部分,但是當我上次使用它時是免費的,而且相當容易使用)。另外,如果您向我們展示您嘗試實現的佈局圖像,或者以相當詳細的方式對其進行描述,我們可以幫助您指導最佳佈局管理器組合以首先嚐試。

相關問題