想要在java swing中从面板的开头对齐组件

时间:2014-08-07 09:09:29

标签: java swing alignment layout-manager gridbaglayout

我有一个小组,最重要的是我连续添加JLabelJTextField

一切正常。但我的面板的大小非常大,我想从面板的左上角添加这些标签和文本字段。

你能否就此提出任何建议..

List<CPWARackExpData> expList = ...;
for (int i = 0; i < expList.size(); i++) {
    JLabel expLabel = expList.get(i).getExpUIComp().getExpLabel();
    String sExpName = expList.get(i).getExpName();
    if ((sExpName.startsWith(sSubString1) == false))
        continue;
    sConfigLabelName = sExpName.substring(sSubString1.length(),
        sExpName.length());
    expLabel.setText(sConfigLabelName);
    add(expLabel, getConstraint(new int[] {1, i, 1, 1}));
    JTextField expTextField = expList.get(i).getExpUIComp()
            .getExpTextField();
    expTextField.setPreferredSize(new Dimension(50, 17));
    expTextField.setText(expList.get(i).getExpValue());
    add(expTextField, getConstraint(new int[] {2, i, 1, 1}));
}

// Create the constraints
private GridBagConstraints getConstraint(int[] c) {
    GridBagConstraints g = new GridBagConstraints();
    g.gridx = c[0];
    g.gridy = c[1];
    g.gridwidth = c[2];
    g.gridheight = c[3];
    g.anchor = GridBagConstraints.FIRST_LINE_START;
    g.ipadx = 30;
    g.ipady = 15;
    return g;
}

1 个答案:

答案 0 :(得分:1)

不要将setPreferedSize(...)用于组件,所有尺寸都必须由LayoutManager计算。

你可以使用虚拟JLabel,它可以获取面板下的空格,例如:

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

public class TestFrame extends JFrame {

    public TestFrame() {
        init();
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack();
        setLocationRelativeTo(null);
        setVisible(true);
    }

    private void init() {
        setLayout(new GridBagLayout());
        for (int i = 0; i < 5; i++) {
            JLabel expLabel = new JLabel(""+i);
            String sExpName = "text"+i;

            add(expLabel, getConstraint(new int[] {1, i, 1, 1}));
            JTextField expTextField = new JTextField();
            expTextField.setText(sExpName);
            add(expTextField, getConstraint(new int[] {2, i, 1, 1}));
        }
        GridBagConstraints c = getConstraint(new int[] {1,6,2,1});
        c.fill = GridBagConstraints.BOTH;
        c.weightx = 1;
        c.weighty = 1;
        add(new JLabel(" "),c);
    }

    private GridBagConstraints getConstraint(int[] c) {
        GridBagConstraints g = new GridBagConstraints();
        g.gridx = c[0];
        g.gridy = c[1];
        g.gridwidth = c[2];
        g.gridheight = c[3];
        g.anchor = GridBagConstraints.FIRST_LINE_START;
        g.ipadx = 30;
        g.ipady = 15;
        return g;
    }


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

}

或在面板中使用LayoutManager的组合,更改下一个init方法:

private void init() {
    JPanel p = new JPanel();
    p.setLayout(new GridBagLayout());
    for (int i = 0; i < 5; i++) {
        JLabel expLabel = new JLabel(""+i);
        String sExpName = "text"+i;

        p.add(expLabel, getConstraint(new int[] {1, i, 1, 1}));
        JTextField expTextField = new JTextField();
        expTextField.setText(sExpName);
        p.add(expTextField, getConstraint(new int[] {2, i, 1, 1}));
    }
    JPanel dummyPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
    dummyPanel.add(p);
    add(dummyPanel,BorderLayout.PAGE_START);
}

enter image description here