我正在尝试用Java创建一个SpringLayout,这是我的代码(从Oracle Java文档中获取)
import javax.swing.*;
import java.awt.*;
public class SpringForm {
private static void createAndShowGUI() {
String[] labels = {"Side1: ", "Side2: ", "Side3: "};
int numPairs = labels.length;
//Create and populate the panel.
JPanel p = new JPanel(new SpringLayout());
javax.swing.JButton calculate_btn;
calculate_btn = new javax.swing.JButton();
for (int i = 0; i < numPairs; i++) {
JLabel l = new JLabel(labels[i], JLabel.TRAILING);
p.add(l);
JTextField textField = new JTextField(10);
l.setLabelFor(textField);
p.add(textField);
}
calculate_btn.setText("Calculate");
p.add(calculate_btn);
//Lay out the panel.
SpringUtilities.makeCompactGrid(p,
numPairs, 2, //rows, cols
6, 6, //initX, initY
6, 6); //xPad, yPad
//Create and set up the window.
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Set up the content pane.
p.setOpaque(true); //content panes must be opaque
frame.setContentPane(p);
//Display the window.
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
//Schedule a job for the event-dispatching thread:
//creating and showing this application's GUI.
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
使用上面的代码我得到了这个
但实际上我希望得到这个
我不想做任何其他事情!只是oracle的帮助表明springlayout真的接近我的需要 我想做的是得到如下图所示的布局,我不确定下面使用的布局是什么,而且在我尝试使用SpringLayout时我注意到当我们扩展窗口大小时控件会自动改变它们的大小我想禁用它,但它有点没有意义,因为当我们调整窗口时,SpringLayout明确表示它正在做什么,调整控件
答案 0 :(得分:2)
来自SpringLayout
的{{3}}(实际上几乎是第一行):
在JDK 1.4版中添加了
SpringLayout
类,以支持GUI构建器中的布局。SpringLayout
是一个非常灵活的布局管理器,可以模拟其他布局管理器的许多功能。但是,SpringLayout
非常低级,因此你真的只应该使用GUI构建器,而不是试图手动编写弹簧布局管理器。 (重点补充。)
我已经在Java专业编程多年了,甚至我也不会手动编程SpringLayout
。我的建议是使用Java trails代替。它们的API对于手工编写代码来说简单得多,并且可以生成非常接近原生的布局。我已经使用了很长时间了,而且我比其他任何我尝试过的都更喜欢它。由于空间填充的工作方式,它与Java的MigLayout library结合使用时特别好。我强烈推荐它。
首先要做的事情:
以下是使用MigLayout
生成与您发布的示例图像类似的布局的示例:
public static void main(String[] args) {
JFrame frame = new JFrame("Testing MigLayout");
JPanel contentPane = new JPanel(new MigLayout("fillx"));
// Row 1
JLabel areaLabel = new JLabel("Area of Triangle");
areaLabel.setFont(areaLabel.getFont().deriveFont(16.0f));
areaLabel.setHorizontalAlignment(JLabel.CENTER);
contentPane.add(areaLabel, "spanx, growx, wrap");
// wrap indicates a new row
// Row 2
JLabel side1Label = new JLabel("Side 1:");
contentPane.add(side1Label, "alignx trailing");
JTextField side1Field = new JTextField();
side1Field.setColumns(6);
contentPane.add(side1Field, "alignx leading, wrap");
// Row 3
JLabel side2Label = new JLabel("Side 2:");
contentPane.add(side2Label, "alignx trailing");
JTextField side2Field = new JTextField();
side2Field.setColumns(6);
contentPane.add(side2Field, "alignx leading, wrap");
// Row 4
JLabel side3Label = new JLabel("Side 3:");
contentPane.add(side3Label, "alignx trailing");
JTextField side3Field = new JTextField();
side3Field.setColumns(6);
contentPane.add(side3Field, "alignx leading, wrap");
// Row 5
JButton calculateButton = new JButton("Calculate Area");
contentPane.add(calculateButton, "spanx, growx");
frame.setContentPane(contentPane);
// Resizes automatically
frame.pack();
// Centers automatically
frame.setLocationRelativeTo(null);
// Exit when the frame is closed
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
及其输出:
当然,这没有所有的逻辑,但它仍然显示了MigLayout的力量。当您开始涉及更复杂的应用程序并希望组件扩展和与窗口签约时,MigLayout可以很好地完成。如果你曾经使用GridBadLayout
,你会注意到MigLayout
只是它的一个加速版本。
有关这些内容的参考资料,请查看备忘单。我使用的每件作品都有解释。具体来说,MigLayout
构造函数(此处为"fillx"
)中声明的任何内容都是布局约束,以及add
方法中声明的任何内容(例如"spanx"
和{{1}是组件约束。您可以通过练习和实验来获得更多正确的组合,从而创建出色的GUI。
话虽如此,总有其他更简单的布局管理器,如"wrap"
或GridLayout
。对于像你这样的简单应用程序,那些布局管理器非常好。当您开始进入更密集的应用程序时,我建议您进入MigLayout。为了阅读这些,我推荐Java路径。那里还有BorderLayout
,您可以将其作为起点。我建议坚持使用这些手册:
BoxLayout
BorderLayout
BoxLayout
CardLayout
FlowLayout
GridBagLayout
答案 1 :(得分:0)
我尝试使用弹簧布局,但在GUI编辑器之外我发现它非常令人困惑。 如果可以的话,我建议你换成另一位经理。