【问题标题】:Java component positioning on GridBagLayoutJava 组件在 GridBagLayout 上的定位
【发布时间】:2018-07-30 03:26:46
【问题描述】:

我正在尝试使用 GridBagLayout 在 JPanel 上定位组件,但我得到的输出与我的预期完全不同。希望在stackoverflow中与聪明的人一起弄清楚:)。

下面我提供了一段代码和程序的屏幕截图。我的问题是:

  1. 为什么 JLabel Choose measure system to convert 不在 Y-axis = 1 上?据我所知,c.gridy=1 向下一个像素,但标签卡在顶部,框架标题中没有空间。而且,为什么它的位置如此奇怪,即不是真的在中心,也不是在开始?

  2. 为什么ComboBoxesFrom...To...之间有这么大的空格,而ComboBoxTo...TextFieldEnter value here...之间却没有空格?

    李>

代码如下:

    JPanel container = new JPanel();
    container.setLayout(new GridBagLayout());
    getContentPane().add(container, BorderLayout.NORTH);
    TitledBorder outputCenter;
    GridBagConstraints c = new GridBagConstraints();

    label = new JLabel("Choose measure system to convert");
    label.setFont(new Font("Times New Roman", Font.PLAIN, 20));
    c.gridx = 0;
    c.gridy = 1;
    container.add(label, c);

    fromList = new JComboBox<String>(convertFrom); 
    c.gridx = 0;
    c.gridy = 2;
    container.add(fromList, c);

    toList = new JComboBox<String>(convertTo);
    c.gridx = 1;
    c.gridy = 2;
    container.add(toList, c);

    //Field where user enters the value to be converted
    input = new JTextField("Enter value here...");
    input.setPreferredSize(new Dimension(150,30));;
    input.setEditable(true);
    input.setBackground(Color.WHITE);
    input.setBorder(BorderFactory.createLineBorder(Color.BLACK));
    input.addMouseListener(new MouseAdapter(){
        public void mouseClicked(MouseEvent e){
            input.setText("");}});
    c.gridx = 2;
    c.gridy = 2;
    container.add(input, c); 

这是截图:

编辑:如果我将代码更改为:

    label = new JLabel("Choose measure system to convert");
    label.setFont(new Font("Times New Roman", Font.PLAIN, 20));
    c.gridx = 0; 
    c.gridy = 1;
    container.add(label, c);

    label = new JLabel("Choose measure system to convert");
    label.setFont(new Font("Times New Roman", Font.PLAIN, 20));
    c.gridx = 1; // changed this line
    c.gridy = 1;
    container.add(label, c); 

结果是这样的:

这让我很困惑,为什么改变一个组件的位置会影响一切?

【问题讨论】:

  • This is very confusing me as why changing the position of one component effects everything? - 您将标签从第一列移到了第二列。每列的宽度由添加到该列的最大组件的宽度决定。因此,当您将标签从第一列移动到第二列时,列的宽度会随着添加到每列的每个组件而变化。
  • 在第一个示例中,标签是最大的组件,位于第一列,“from”组合框位于该列的中心。在第二个示例中,标签在第二列中也是最大的,并且“to”组合框在该列中居中。阅读 Swing 教程中有关 [如何使用 GridBagLayout]() 的部分,以获取更多信息和所有约束的解释以及工作示例。
  • @camickr,谢谢!!!

标签: java swing layout-manager gridbaglayout


【解决方案1】:

GridBagConstraints 将框架设置为有效的网格。除非另有说明,否则默认情况下,网格中单元格的宽度和高度由单元格中数据的大小决定。所以如果你想在单元格之间添加一些空格,我建议ipadxipady。您还可以使用anchor 来调整单元格中的数据。我还建议weightxweighty 调整实际单元格大小。

所以想象一下你当前的设置是这样的:

编辑:您的新 GBC 外观示例。数字是 (gridx,gridy)

【讨论】:

  • 我添加了一个版本。请您给点建议。为什么如果我更改 JLabel 的位置,它会影响所有其他组件的位置?谢谢
  • 您必须每次更改每个标签的位置,因为GridBagConstraints c 是一个在设置每个变量后保持不变的对象。
  • 谢谢。每次换位置是什么意思?我正在更改它,即 y = 1、y = 2 等...或者您的意思是我必须在每个组件上声明一个新的 GridBagConstraints?
  • 哎呀,我的 x 和 y 坐标翻转了。不,您不必每次都声明一个新的 GBC (GridBagConstraints)。只需为每个项目重新分配特定值。玩转 GBC 字段,直到找到适合您对每个项目的需求的内容。就像你对 c.gridxc.gridy 所做的那样。
【解决方案2】:

为什么JLabel 选择要转换的度量系统不在Y-axis = 1 上?据我所知,c.gridy=1 向下一像素

您自己弄糊涂了,c.gridy = 1 不是将其定位在向下 1 个像素,而是在下一行,但由于没有上一行,所以它占据了第一行。作为参考,请参阅:GridBagConstraints#gridy,其内容如下:

指定组件显示区域顶部的单元格,其中最顶部的单元格的 gridy=0。值 RELATIVE 指定将组件放置在恰好在添加该组件之前添加到容器中的组件的下方。

下一个问题:

而且,为什么它的位置如此奇怪,即,不是真的在中心,也不是在开始?

它以自己的单元格为中心,如果您想以JFrame 为中心,那么您可能需要在自己的gridx = 1 上创建它,其余组件在其他组件(0 和 2)上或根据您希望它看起来像跨越 2 列或更多列...

为什么ComboBoxes From...和To...之间有这么大的空格,而ComboBox To...和TextField Enter value here...之间没有空格?

这是因为你的程序给了它所有额外的空间,因为第一个单元格上的文本很大......

你可以有这样的东西:

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;

import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class GridBagLayoutExample {
    private JFrame frame;
    private JPanel pane;
    private JLabel label;
    private JTextField field;
    private JComboBox<String> box1;
    private JComboBox<String> box2;
    private GridBagConstraints gbc;

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new GridBagLayoutExample()::createAndShowGui);
    }

    private void createAndShowGui() {
        frame = new JFrame(getClass().getSimpleName());

        pane = new JPanel();
        pane.setLayout(new GridBagLayout());

        gbc = new GridBagConstraints();

        label = new JLabel("Choose measure system to convert");

        box1 = new JComboBox<>(new String[] {"From..."});
        box2 = new JComboBox<>(new String[] {"To..."});

        field = new JTextField(10);

        gbc.insets = new Insets(5, 5, 5, 5); //We add extra space at top, left, bottom, right of each component

        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.gridwidth = 3; //We make our text to span 3 cells
        pane.add(label, gbc);

        gbc.gridy = 1;
        gbc.gridwidth = 1; //We return the spanning to 1 single cell
        pane.add(box1, gbc);

        gbc.gridx = 1;
        pane.add(box2, gbc);

        gbc.gridx = 2;
        pane.add(field, gbc);

        frame.add(pane);
        frame.pack();
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

产生以下输出:

【讨论】:

  • @sumu00 如果此答案有帮助并回答了您的问题,请不要忘记accept it
猜你喜欢
  • 1970-01-01
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
  • 2020-08-29
  • 2014-03-23
  • 2012-10-13
  • 2012-09-27
  • 1970-01-01
相关资源
最近更新 更多