我有几个JPanel
,其中包含JLabel
和JTextField
s,用于我的Swing应用程序中的用户输入。
我手工编辑NetBeans GUI Builder生成的代码,但仍希望保持类似的布局。
我开始使用GridLayout
。我可以调整hgap
以使我的JLabel
和JTextField
的大小合适,但我必须为所有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());
}
}
我第一次运行程序时看起来很好。但是,当我调整窗口大小时,文本字段会拉伸,因此每个文本字段都会填充窗口高度的一半。我希望它们保持与窗口调整大小时最初相同的高度。
答案 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会为你节省的努力。