java - 多个组件的复杂布局

标签 java swing user-interface layout-manager miglayout

我正在设计一个 GUI,其中包含如下所示的组件。但在第二行中,我想管理组件之间的空间。例如,在第二行中,我希望将 JLabel“移动到时间”和 JTextField 都放置在没有太大间距的情况下。正如我所看到的,现在 MigLayoutJTextField 与第一行中的第二个组件对齐。然后,第二行中的 JButton“移动”应与第一行中的第二个组件对齐。我该如何实现这一目标?下面是我的代码。我在 MigLayout 上查找了许多备忘单和快速入门指南,但我还无法管理。有人可以建议更改我的代码片段吗?谢谢。

`

    JPanel helper = new JPanel( new MigLayout( "" ) );
    helper.add( new JButton( "Add puncta coordinates from CSV" ), "width 250:20" );
    helper.add( new JButton( "Add track coordinates from CSV" ), "wrap" );
    helper.add( new JLabel( "Move to time:" ) );
    JTextField tMoveTime = new JTextField();
    helper.add( tMoveTime, " gap 2px, width 75:20" );
    JButton bMoveTime = initMoveButton();
    helper.add( bMoveTime, "width 75:20" );

`

enter image description here

实际上,我打算制作以下包含所有按钮和文本字段的完整 GUI,还有其他布局更适合吗?如果是,是否可以指出推荐布局的示例代码片段?谢谢。

enter image description here

最佳答案

您可以考虑两种基本方法: 一种是使用高度灵活的布局管理器,例如 MigLayout。我不熟悉,但我可以推荐 GridbagLayout对于工作:

    JPanel helper = new JPanel(  );
    GridBagLayout gbl_helper = new GridBagLayout();
    gbl_helper.columnWidths = new int[]{200, 7, 200, 60, 18, 0};
    gbl_helper.rowHeights = new int[]{20, 20};
    gbl_helper.columnWeights = new double[]{1.0, 0.0, 1.0, 0.0, 0.0, Double.MIN_VALUE};
    gbl_helper.rowWeights = new double[]{0.0, 0};
    helper.setLayout(gbl_helper);

    GridBagConstraints gbc1 = new GridBagConstraints();
    gbc1.fill = GridBagConstraints.HORIZONTAL;
    gbc1.gridwidth = 2;
    gbc1.anchor = GridBagConstraints.NORTHWEST;
    gbc1.insets = new Insets(5,5,5,5);
    gbc1.gridx = 0;
    gbc1.gridy = 0;
    JButton button1 = new JButton( "Add puncta coordinates from CSV" );
    helper.add( button1, gbc1 );

    GridBagConstraints gbc2 = new GridBagConstraints();
    gbc2.fill = GridBagConstraints.HORIZONTAL;
    gbc2.gridwidth = 2;
    gbc2.anchor = GridBagConstraints.NORTHWEST;
    gbc2.insets = new Insets(5,5,5,5);
    gbc2.gridx = 2;
    gbc2.gridy = 0;
    JButton button2 = new JButton( "Add track coordinates from CSV" );

    helper.add( button2, gbc2 );

    GridBagConstraints gbc3 = new GridBagConstraints();
    gbc3.insets = new Insets(0, 0, 0, 5);
    gbc3.gridx = 0;
    gbc3.gridy = 1;
    JLabel label = new JLabel( "Move to time:" );
    helper.add( label, gbc3 );

    JTextField tMoveTime = new JTextField();
    tMoveTime.setColumns(15);
    GridBagConstraints gbc4 = new GridBagConstraints();
    gbc4.anchor = GridBagConstraints.WEST;
    gbc4.insets = new Insets(0, 0, 0, 5);
    gbc4.gridx = 1;
    gbc4.gridy = 1;
    helper.add( tMoveTime, gbc4);

    JButton bMoveTime = new JButton("Move");
    GridBagConstraints gbc5 = new GridBagConstraints();
    gbc5.insets = new Insets(0, 0, 0, 5);
    gbc5.anchor = GridBagConstraints.NORTHEAST;
    gbc5.gridx = 3;
    gbc5.gridy = 1;
    helper.add( bMoveTime, gbc5 );

enter image description here

另一种方法是使用子面板将复杂布局划分为更简单的布局,每个子面板都有自己的布局管理器:

enter image description here

    JPanel helper = new JPanel(  );
    helper.setLayout(new BoxLayout(helper, BoxLayout.Y_AXIS));
    getContentPane().add(helper);

    JPanel topPanel = new JPanel();
    helper.add(topPanel);
    JButton button1 = new JButton( "Add puncta coordinates from CSV" );
    topPanel.add(button1);
    JButton button2 = new JButton( "Add track coordinates from CSV" );
    topPanel.add(button2);

    JPanel bottomPanel = new JPanel();
    helper.add(bottomPanel);
    bottomPanel.setLayout(new BoxLayout(bottomPanel, BoxLayout.X_AXIS));

    JPanel bottomRIght = new JPanel();
    bottomPanel.add(bottomRIght);
    JLabel label = new JLabel( "Move to time:" );
    bottomRIght.add(label);
    JTextField tMoveTime = new JTextField();
    bottomRIght.add(tMoveTime);
    tMoveTime.setColumns(15);

    JPanel bottomleftPanel = new JPanel();
    bottomPanel.add(bottomleftPanel);
    bottomleftPanel.setLayout(new FlowLayout(FlowLayout.RIGHT, 5, 5));
    JButton bMoveTime = new JButton("Move");
    bottomleftPanel.add(bMoveTime);

enter image description here

关于java - 多个组件的复杂布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53997402/

相关文章:

java - J2SE 代理认证

java - 我可以组合两个 DefaultListModel 吗?

java - 采用 Swing 对话框方法并将其转换为 SWT

java - 限制 jtextfield 不接受空格作为第一个字符

java - 打开新的 jFrame 时清空 ArrayList

user-interface - 在网络上运行 Qt 信号/插槽的任何想法?

java - 减少代码..以发挥作用

java - 通过在 Apache Spark Java 中搜索数据集的列标题来查找列索引

java - 如果在表中找不到给定数字,如何不打印整个索引

user-interface - 为 Haskell 积极开发并有据可查的 GUI 工具