java - 以编程方式布局标签和按钮

标签 java swing user-interface layout 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();
            }
        });
    }
}

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

enter image description here

但实际上我想得到这个

enter image description here

我不介意任何其他布局!只是oracle帮助显示springlayout确实很接近我的需要 我想做的是获得如下图所示的布局,我不确定下面使用的布局是什么,而且在我尝试使用 SpringLayout 时我注意到当我们扩展窗口大小时控件会自动更改它们的大小我想禁用它,但它有点没有意义,因为 SpringLayout 清楚地意味着它在做什么,调整控件,当我们调整窗口时

最佳答案

来自Java trails SpringLayout(实际上几乎是第一行):

The SpringLayout class was added in JDK version 1.4 to support layout in GUI builders. SpringLayout is a very flexible layout manager that can emulate many of the features of other layout managers. SpringLayout is, however, very low-level and as such you really should only use it with a GUI builder, rather than attempting to code a spring layout manager by hand. (Emphasis added.)

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


要事第一:

  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 Example

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

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

也就是说,总有其他更简单的布局管理器,如 GridLayoutBoxLayout。对于像您这样的简单应用程序,那些布局管理器非常好。当您开始进入更密集的应用程序时,我建议您进入 MigLayout。要阅读这些内容,我推荐 Java trails。有一个 visual guide to layouts也在那里,您可以将其用作起点。我建议坚持使用这些进行手动布局:

  • 边框布局
  • BoxLayout
  • CardLayout
  • FlowLayout
  • GridBagLayout
  • 网格布局

关于java - 以编程方式布局标签和按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12794585/

相关文章:

java - 单击时如何从 JButton 中获取文本?

java - 简单的退出按钮不起作用

java - JTable 中没有标题

java - 如何将数据从1个JFrame形式的文本字段传递到另一个JFrame形式的JList?

python - OpenCV不在Docker内部显示图像

java - 使用子字符串搜索输入

java - NSIS Eclipse 插件无法在 Helios 和 Linux 平台上工作

c++ - 在 C++ 中制作 3d 文本编辑器

java - 删除双向链表Java中具有最小值的泛型节点

java - 在不损失质量的情况下读取/写入 JPG 图像的最快方法?