2013-08-03 23 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