2013-08-03 28 views
3

我在窗體上使用SpringLayout,但正如你所看到的,它的外觀不好(大小不一)!SpringLayout中的組件大小

public class t8 extends JFrame { 

JButton okButton, cancellButton; 
JTextField idTF, nameTf; 
JLabel idlbl, namelbl; 

public t8() { 
    add(createPanel(), BorderLayout.CENTER); 

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setSize(400, 500); 
    setLocation(400, 100); 
    setVisible(true); 
} 

public static void main(String[] args) { 
    new t8(); 
} 

public JPanel createPanel() { 
    JPanel panel = new JPanel(); 
    okButton = new JButton("Ok"); 
    cancellButton = new JButton("Cancel"); 
    idTF = new JTextField(10); 
    nameTf = new JTextField(10); 
    idlbl = new JLabel("ID"); 
    namelbl = new JLabel("Name"); 
    panel.add(idlbl); 
    panel.add(idTF); 
    panel.add(namelbl); 
    panel.add(nameTf); 
    panel.add(okButton); 
    panel.add(cancellButton); 

    panel.setLayout(new SpringLayout()); 
    SpringUtilities.makeCompactGrid(panel, 3, 2, 20, 50, 50, 100); 
    return panel; 
} 
} 

我改變makeCompactGrid數字,但沒有成功!

(的JTextFields的寬度大,我的按鈕的大小是不同的) enter image description here

+0

'GourpLayout',看到[這裏](http://stackoverflow.com/a/8504753/230513),是一個替代? – trashgod

+1

+1參見@aterai的[一擊球](http://stackoverflow.com/a/16602249/714968),比例可以用(非常相似和/或用錨點)設置GridBagLayout,剩下的想法被實現在MigLayout中 – mKorbel

+0

@mKorbel好幫手 – Sajad

回答

1

如果您不關心佈局管理器,但只關心佈局,那麼您應該使用GridLayout,或者如果您不希望所有組件的尺寸相同,則可以使用GridBagLayout。下面是如何與一個網格佈局(只顯示了改進的方法):

public JPanel createPanel() { 
    JPanel panel = new JPanel(); 
    panel.setLayout(new GridLayout()); 
    okButton = new JButton("Ok"); 
    cancellButton = new JButton("Cancel"); 
    idTF = new JTextField(10); 
    nameTf = new JTextField(10); 
    idlbl = new JLabel("ID"); 
    namelbl = new JLabel("Name"); 
    panel.add(idlbl); 
    panel.add(idTF); 
    panel.add(namelbl); 
    panel.add(nameTf); 
    panel.add(okButton); 
    panel.add(cancellButton); 
    return panel; 
} 

並配有GridBagLayout

public JPanel createPanel() { 
    JPanel panel = new JPanel(); 
    GridBagLayout gb = new GridBagLayout(); 
    GridBagConstraints gbc = new GridBagConstraints(); 
    panel.setLayout(gb); 
    okButton = new JButton("Ok"); 
    cancellButton = new JButton("Cancel"); 
    idTF = new JTextField(10); 
    nameTf = new JTextField(10); 
    idlbl = new JLabel("ID"); 
    namelbl = new JLabel("Name"); 
    add(panel, idlbl, 0, 0, 1, 1, gb, gbc, false); 
    add(panel, idTF, 0, 1, 1, 1, gb, gbc, true); 
    add(panel, namelbl, 1, 0, 1, 1, gb, gbc, false); 
    add(panel, nameTf, 1, 1, 1, 1, gb, gbc, true); 
    add(panel, okButton, 2, 0, 1, 1, gb, gbc, false); 
    add(panel, cancellButton, 2, 1, 1, 1, gb, gbc, true); 
    return panel; 
} 

private void add(Container outer, Component c, int x, int y, int w, int h, GridBagLayout gb, GridBagConstraints gbc, boolean wide) { 
    gbc.gridx = x; 
    gbc.gridy = y; 
    gbc.gridwidth = w; 
    gbc.gridheight = h; 
    if (wide) { 
     gbc.weightx = 100; 
    } else { 
     gbc.weightx = 0; 
    } 
    gb.setConstraints(c, gbc); 
    outer.add(c); 
} 

我相信,額外的GridBagLayout複雜性也許會是值得的。

1

我會建議你使用NetBeans拖放工具,它可以讓你身體的部件和也會給你預覽。 如果你想用代碼來做,只需使用免費的佈局,並手動設置每個組件的位置和大小通過setSize()和setLocation()方法,雖然這將需要更多的代碼行,但會確保所有組件處於正確的位置。

+1

AFAIK,'NetBeans GUI編輯器不支持'SpringLayout'。 – trashgod

+0

哦,是的,我忘了提及這一點,感謝你這麼做,其次我不認爲NetBeans中有任何需要使用springlayout的工具,它的拖放工具非常易於使用 – JProgrammer

+0

-1來提示手動組件定位。如果外觀改變或者即使窗口被調整大小,這也不起作用。 – tbodt