2

我有一个非常简单的 Java 程序(见下文)。GridLayout 有 20 行和 4 列。如您所知,元素应该通过 (GridLayout) 定义水平添加。但是,我将两个元素(标签)垂直放置在另一个之上。

我给它们上色并意识到标签占据了整行,因此产生了垂直效果。但是后来我也使用 setSize(5,5) 来使它们更小,但是它们仍然占据了整行。关于为什么会发生这种情况以及如何修复/设置更小的尺寸/等的任何建议?

public class Sam extends JFrame {

    public JButton btn_arr;
    public Container c;
    public JLabel[] lbl = new JLabel[20];


    public Sam()
    {
        c = getContentPane();
        c.setLayout(new GridLayout(20,4));
        lbl[1] = new JLabel("Column1");
        c.add(lbl[1]);

        lbl[2] = new JLabel("Column2");
        c.add(lbl[2]);

        show();     
    }

    public static void main(String[] args) 
    {
        Sam x = new Sam();
        x.setVisible(true);
        x.setSize(7500,4500);
    }

}
4

2 回答 2

3

您只需将两个组件添加到网格中,以便它们将其填满。您需要将更多组件添加到网格中作为占位符,以便它可以将原始 JLabels 放置在适当的位置,可能是空的 JLabels 或 JPanel。

顺便说一句,您应该避免设置任何 Swing 组件的大小。你现在的尺寸是7500,4500的尺寸就有点大了。

顺便说一句,也许您想在此处使用 JTable。

编辑:如果你想要一个 4 列和可变行数的 GridLayout,请使用0GridLayout 行常量:

c.setLayout(new GridLayout(0, 4));

例如,

import java.awt.*;
import javax.swing.*;

public class Sam extends JFrame {
   public static final int COLUMN_COUNT = 4;

   public JButton btn_arr;
   public Container c;
   public JLabel[] lbl = new JLabel[COLUMN_COUNT];

   public Sam() {
      c = getContentPane();
      c.setLayout(new GridLayout(0, COLUMN_COUNT));

      for (int i = 0; i < lbl.length; i++) {
         lbl[i] = new JLabel("Column " + (i + 1));
         c.add(lbl[i]);
      }

   }

   public static void main(String[] args) {
      Sam x = new Sam();
      x.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      x.pack();
      x.setLocationRelativeTo(null);
      x.setVisible(true);
      // x.setSize(7500,4500);
   }

}

但我仍然想知道 JTable 在这里是否不能更好地工作。

于 2012-12-30T15:12:02.707 回答
2

使用 GridLayout 要记住的一件事是,它旨在覆盖整个包含面板,尽可能地调整单元格的大小,并且添加到单元格的元素将被扩展以填充整个单元格。因此,随着单元格大小的变化,标签的大小也会发生变化。有效地网格单元强制所有包含元素在 X 和 Y 方向上的扩展/收缩。

One way to prevent that from happening if you must use the GridLayout is to not add the labels directly to the container that uses the GridLayout, but instead put each label inside a JPanel that uses a FlowLayout (the default) that you can set alignment of either Left, Middle or Right, then add that JPanel to the Grid container. The JPanel will be resized but it will not change the size of the Label.

Or use the GridBagLayout manager. More complex, but once you understand it, it makes life easier. But as Hovercraft mentioned, if what you are trying to do is create a grid with column headers, a JTable might be a better option.

于 2012-12-30T17:05:28.447 回答