标签和按钮的编程方式

noo*_*mer 7 java layout user-interface swing springlayout

我正在尝试用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();
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

通过上面的代码,我得到了这个

在此输入图像描述

但实际上我希望得到这个

在此输入图像描述

我不需要任何其他布局!只是oracle帮助显示springlayout非常接近我的需要我想要做的是获得如下图所示的布局,我不确定下面使用的布局是什么,并且在我的尝试中我使用的是SpringLayout I注意到当我们扩展窗口大小时控件会自动改变它们的大小我想要禁用它但是它有点没有意义,因为当我们调整窗口时SpringLayout明确表示它正在做什么,调整控件

Bri*_*ian 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);
}
Run Code Online (Sandbox Code Playgroud)

及其输出:

米格布局示例

当然,这没有所有逻辑,但它仍然显示了 MigLayout 的强大功能。当您开始进入更复杂的应用程序并希望组件随窗口扩展和收缩时,MigLayout 做得非常好。如果您曾经使用过GridBadLayout,您会发现这MigLayout只是它的升级版本。

有关所有各个部分的参考信息,只需查看备忘单即可。我使用的每件作品都有一个解释。具体来说,MigLayout构造函数中声明的任何内容(此处为"fillx")都是布局约束,方法中声明的任何内容add(例如"spanx""wrap")都是组件约束。您还可以通过练习和实验进行更多操作,以获得创建出色 GUI 的正确组合。

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

  • BorderLayout
  • BoxLayout
  • CardLayout
  • FlowLayout
  • GridBagLayout
  • GridLayout

  • 我已经更新了我的答案。如果您还有其他问题,我很乐意在早上回答。 (2认同)