7

我正在尝试用 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 我注意到当我们扩展窗口大小时,控件会自动改变它们的大小

4

2 回答 2

2

从(实际上几乎是第一行)的Java 跟踪中:SpringLayout

该类SpringLayout是在 JDK 1.4 版中添加的,以支持 GUI 构建器中的布局。SpringLayout是一个非常灵活的布局管理器,可以模拟其他布局管理器的许多功能。SpringLayout然而,它是非常低级的,因此您真的应该只将它与 GUI 构建器一起使用,而不是尝试手动编写 spring 布局管理器。(强调补充。)

多年来,我一直在专业地使用 Java 进行编程,甚至我也不会SpringLayout手动编程。我的建议是改用MigLayout 库。他们的 API 对于手动布局代码要简单得多,并且可以生成非常接近原生的布局。我已经使用它很长时间了,我更喜欢它而不是我尝试过的任何其他东西。BorderLayout由于空间填充的工作方式,与 Java 结合使用时特别好。我强烈推荐它。


第一件事:

  1. MigLayout 是基于单元格的,但也支持拆分和跨越单元格。如果您曾经使用过 HTML 或 Excel,那么您应该知道这意味着什么。这是不言自明的。
  2. MigLayout 的默认输入方法是字符串,它们是最容易理解的,但它们也有一个非常好的 API 来创建布局。
  3. MigLayout 支持的内容远远超出我在 SO 问题中所能涵盖的范围,因此请点击上面的链接并查看快速入门指南和备忘单。到目前为止,它们是您可以放入约束中的最佳资源。

这是一个示例,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 的强大功能。当您开始进入更复杂的应用程序并希望组件随窗口扩展和收缩时,MigLayout 做得很好。如果您曾经使用过GridBadLayout,您会注意到这MigLayout只是它的升级版。

有关这一切的参考资料,请查看备忘单。我使用的每一件作品都有一个解释。具体来说,在MigLayout构造函数中声明的任何内容(此处为"fillx")都是布局约束,而在add方法中声明的任何内容(例如"spanx""wrap")都是组件约束。您还可以通过实践和实验来获得创建出色 GUI 的正确组合。

话虽如此,总会有其他更简单的布局管理器,例如GridLayoutor BoxLayout。对于像您这样的简单应用程序,那些布局管理器非常好。当您开始进入更密集的应用程序时,我建议您进入 MigLayout。为了阅读这些内容,我推荐 Java trails。那里还有一个布局的视觉指南,您可以将其用作起点。我建议坚持使用这些手动布局:

  • BorderLayout
  • BoxLayout
  • CardLayout
  • FlowLayout
  • GridBagLayout
  • GridLayout
于 2012-10-09T07:13:46.800 回答
0

我尝试使用 spring 布局,但在 GUI 编辑器之外我发现它非常混乱。如果可以的话,我会建议你换一个经理。

  • JGoodies的 FormLayout非常有名,许多 GUI 构建器都支持它。语法一开始可能很难掌握,但是一旦掌握了,构建漂亮的表单真的很容易
  • 据说MigLayout也很不错
于 2012-10-09T07:16:45.737 回答