2012-12-30 111 views
1

我有一個非常簡單的Java程序(請參見下文)。 GridLayout有20行和4列。如你所知,元素應該被水平添加(GridLayout)定義。但是,我將兩個元素(標籤)垂直放置在另一個之上。要在GridLayout中調整大小的JLabel

我給它們着色並意識到標籤佔據了整行,因此產生了垂直效果。但是,我也使用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); 
    } 

} 

回答

3

您只是將兩個組件添加到網格,所以他們會填補它。您需要將更多組件添加到網格中作爲佔位符,以便它可以將原始JLabel放置在適當的位置,可能是空的JLabels或JPanel。

另外,您應該避免設置任何Swing組件的大小。您目前的尺寸7500,4500有點大。作爲第二方,也許你想在這裏使用JTable。

編輯:如果你想與4列和可變行數的網格佈局,使用0您的網格佈局行不變:

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在這裏效果不好。

+0

我需要兩個JLabel在同一行,所以這應該通過添加兩個元素一個接一個來完成。如果我有2列,並且需要兩個元素,我會添加第一個元素,然後添加一個空白標籤,然後添加第二個元素(我知道這個技巧)。但事實並非如此,我需要在同一行上放置數組的前兩個元素(每個JLabel)。謝謝! – Sam

+1

@Sam:請參閱編輯。但是我仍然想知道一個JTable在這裏工作會不會更好。 –

+0

我不知道我可以將0用於可變數量的行 - 正是我感興趣的內容。非常好,非常感謝! – Sam

2

GridLayout的一點要注意的是,它被設計爲覆蓋整個包含面板的大小盡可能相等,添加到單元格中的元素將被擴展以填充整個單元格。所以隨着單元尺寸的變化,標籤的大小也會發生變化。有效的網格單元在所有包含的元素的X和Y方向上強制擴展/收縮。

如果您必須使用GridLayout,防止發生這種情況的一種方法是不將標籤直接添加到使用GridLayout的容器,而是將每個標籤放入使用FlowLayout(默認)的JPanel中可以設置Left,Middle或Right的對齊方式,然後將該JPanel添加到Grid容器。 JPanel將被調整大小,但不會更改標籤的大小。

或者使用GridBagLayout管理器。更復雜,但一旦你明白了它,它會讓生活更輕鬆。但正如Hovercraft提到的那樣,如果你想要做的是創建一個帶有列標題的網格,那麼JTable可能是更好的選擇。

+0

非常有幫助,謝謝,我會非常仔細地記下來,並從那個機智申請! – Sam

相關問題