LayoutManager可以将JLabel或JTextField的高度与其字体大小相匹配?

时间:2012-09-16 23:41:58

标签: java swing layout-manager

我有几个JPanel,其中包含JLabelJTextField s,用于我的Swing应用程序中的用户输入。

我手工编辑NetBeans GUI Builder生成的代码,但仍希望保持类似的布局。

我开始使用GridLayout。我可以调整hgap以使我的JLabelJTextField的大小合适,但我必须为所有JPanel单独执行此操作。

是否有标准LayoutManager,它将根据组件的字体大小计算文本组件的正确高度,并在文本组件之间和/或周围填充包含空间的空间?

修改

根据要求,这是一个SSCCE来展示我想要做的事情

GridLayoutSSCCE:

package gridlayoutsscce;

import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class GridLayoutSSCCE {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                JFrame f = new JFrame("Grid Layout SSCCE");
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.add(new GridLayoutSSCCEPanel());
                f.pack();
                f.setVisible(true);
            }
        });
    }
}

GridLayoutSSCCEPanel:

package gridlayoutsscce;

import java.awt.GridLayout;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

class GridLayoutSSCCEPanel extends JPanel {
    public GridLayoutSSCCEPanel() {
        this.setLayout(new GridLayout(2, 2));
        this.add(new JLabel("Label 1:"));
        this.add(new JTextField());

        this.add(new JLabel("Label 2:"));
        this.add(new JTextField());
    }
}

我第一次运行程序时看起来很好。但是,当我调整窗口大小时,文本字段会拉伸,因此每个文本字段都会填充窗口高度的一半。我希望它们保持与窗口调整大小时最初相同的高度。

2 个答案:

答案 0 :(得分:4)

GridBagLayout会做你想要的,虽然它非常灵活,但它也是最复杂的之一。

我确信MigLayout会被提及,但我从未亲自使用过它,我也应该提到JGoodies FormLayout,但我再也没有使用它。

答案 1 :(得分:1)

朋友们不要让朋友使用GridBagLayout(我们在这里都是朋友,对吗?)

使用JGoodies表单布局,这就是您希望SSCCE执行的操作:

class MyFormLayoutSSCCEPanel extends JPanel {
  public MyFormLayoutSSCCEPanel() {
    FormLayout layout = new FormLayout(
      "pref, pref:grow",   // columns
      "pref, pref");       // rows
    this.setLayout(layout);

    CellConstraints cc = new CellConstraints();
    this.add(new JLabel("Label 1:"), cc.xy(1,1));
    this.add(new JTextField(), cc.xy(2, 1));

    this.add(new JLabel("Label 2:"), cc.xy(1, 2));
    this.add(new JTextField(), cc.xy(2, 2));
  }
}

(请注意,这并不会重现原始SSCCE 完全的行为 - 我告诉它要水平增长文本字段以占用所有可用空间。)

我不建议换到JGoodies但是 - 你需要至少几个星期的时间浪费挫败默认的Swing布局管理器才能正确理解JGoodies formlayout会为你节省的努力。