标签和按钮的编程方式

时间:2012-10-09 07:07:09

标签: 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明确表示它正在做什么,调整控件

2 个答案:

答案 0 :(得分:2)

来自SpringLayout的{​​{3}}(实际上几乎是第一行):

  

在JDK 1.4版中添加了SpringLayout类,以支持GUI构建器中的布局。 SpringLayout是一个非常灵活的布局管理器,可以模拟其他布局管理器的许多功能。但是,SpringLayout非常低级,因此你真的只应该使用GUI构建器,而不是试图手动编写弹簧布局管理器。 (重点补充。)

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


首先要做的事情:

  1. MigLayout基于单元格,但也支持拆分和跨越单元格。如果您曾经使用过HTML或Excel,那么您应该知道这意味着什么。这很明显不言自明。
  2. MigLayout的默认输入方法是字符串,它们是最容易理解的,但它们也有非常好的API来创建布局。
  3. MigLayout支持的远远超过我在SO问题中所能涵盖的内容,因此请按照上面的链接查看快速入门指南和备忘单。到目前为止,它们是您可以放入限制条件的最佳资源。
  4. 以下是使用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"和{{1}是组件约束。您可以通过练习和实验来获得更多正确的组合,从而创建出色的GUI。

    话虽如此,总有其他更简单的布局管理器,如"wrap"GridLayout。对于像你这样的简单应用程序,那些布局管理器非常好。当您开始进入更密集的应用程序时,我建议您进入MigLayout。为了阅读这些,我推荐Java路径。那里还有BorderLayout,您可以将其作为起点。我建议坚持使用这些手册:

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

答案 1 :(得分:0)

我尝试使用弹簧布局,但在GUI编辑器之外我发现它非常令人困惑。 如果可以的话,我建议你换成另一位经理。

  • JGoodies' FormLayout非常有名,许多GUI构建器都支持它。一开始语法很难理解,但是一旦你得到它,构建漂亮的表单真的很容易
  • MigLayout据说也是一个非常好的