3

我有几个JPanels ,其中包含JLabels 和JTextFields 用于我的 Swing 应用程序中的用户输入。

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

我开始使用GridLayout. 我可以调整shgap以使我JLabel的 s 和JTextFields 大小合适,但我必须为所有JPanels 单独执行此操作。

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

编辑:

根据要求,这是一个 SSCCE 来展示我正在尝试做的事情

网格布局SSCCE:

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());
    }
}

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

4

2 回答 2

4

GridBagLayout会做你想做的,虽然它是高度灵活的,但它也被认为是最复杂的之一。

我肯定MigLayout会得到提及,但我从未亲自使用过它,我也应该提到JGoodiesFormLayout,但同样,我从未使用过它。

于 2012-09-16T23:57:57.853 回答
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 将为您节省的工作量。

于 2012-09-17T13:51:50.370 回答