JLabel将在GridLayout中调整大小

时间:2012-12-30 15:09:43

标签: java swing jlabel grid-layout

我有一个非常简单的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);
    }

}

2 个答案:

答案 0 :(得分:3)

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

另外,您应该避免设置任何Swing组件的大小。您目前的尺寸为7500,4500有点大尺寸。

除此之外,也许你想在这里使用JTable。

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

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在这里是否会更好用。

答案 1 :(得分:2)

GridLayout要记住的一件事是,它被设计为覆盖整个包含面板,尽可能平均地调整单元格大小,添加到单元格中的元素将被扩展以填充整个单元格。因此,当单元格大小发生变化时,标签的大小也会发生变化。有效地,网格单元强制所有包含元素在X和Y方向上的膨胀/收缩。

如果必须使用GridLayout,防止这种情况发生的一种方法是不将标签直接添加到使用GridLayout的容器中,而是将每个标签放在使用FlowLayout(默认值)的JPanel中设置左,中或右的对齐方式,然后将该JPanel添加到网格容器中。 JPanel将调整大小,但不会更改Label的大小。

或者使用GridBagLayout管理器。更复杂,但一旦你理解它,它会让生活更轻松。但正如Hovercraft所提到的,如果您要做的是创建一个带有列标题的网格,那么JTable可能是更好的选择。