2009-10-20 76 views
1

這是我的程序應該看起來像什麼,我有點困惑我應該在哪裏使用不同的佈局。在GUI中使用不同的佈局

我有一個Window類,它調用Panel類,Panel類調用InputPanel和DisplayPanel類。我的InputPanel類調用了我的DetailsPanel,CrimePanel和ButtonPanel類,使它們組成了輸入選項卡下顯示的內容。我被告知要爲整個窗口使用BorderLayout,並且DetailsPanel(左側面板)和CrimePanel應該是GridLayout。

這是否意味着我應該:

  1. 放入面板BorderLayout的代碼和網格佈局代碼CrimePanel和DetailsPanel或
  2. 放入窗口BorderLayout的代碼,並在面板的網格佈局代碼?

alt text http://img137.imageshack.us/img137/6422/93381955.jpg

回答

5

好的,你的描述有點混亂(或者我今天仍然太累了,或者咖啡因還沒有足夠)。你從別人那裏「調用」面板類的概念也有點奇怪。

但是據我所見,你的第一個選擇是正確的。

一般來說你只是窩在運行時的對象,所以它可能看起來有點像下面這樣:

InputPanel (has BorderLayout) 
+--DetailsPanel (put in BorderLayout.WEST; has GridLayout) 
| +--nameLabel 
| +--nameTextField 
| +--... 
+--CrimePanel (put in BorderLayout.NORTH; has GridLayout) 
| +--murderRadioButton 
| +--arsonRadioButton 
| +--... 
+--ButtonPanel (put in BorderLayout.CENTER; has GridLayout) 
    +--button 

你通常做這在適當類的構造函數:

public class InputPanel { 
    public InputPanel() { 
     this.setLayout(new BorderLayout()); 
     this.add(new DetailsPanel(), BorderLayout.WEST); 
     this.add(new CrimePanel(), BorderLayout.NORTH); 
     this.add(new ButtonPanel(), BorderLayout.CENTER); 
    } 
} 

public class DetailsPanel { 

    JLabel nameLabel; 
    JTextField nameField; 
    // ... 

    public DetailsPanel() { 
     this.setLayout(new GridLayout(5, 1)); 

     nameLabel = new JLabel("Name"); 
     nameField = new JTextField(); 
     // ... 

     this.add(nameLabel); 
     this.add(nameField); 
     // ... 
    } 
} 

... 

但是,我在這裏看到一個小問題:由於GridLayout不允許組件跨越多個列,因此您可能需要將其他面板嵌套在左側的DetailsPanel中。你可以用一個單一的GridBagLayout它具有所需的能力脫身,或嵌套其他面板有:

DetailsPanel (has BorderLayout) 
+--panel1 (has GridLayout with 2 rows, 1 column; put in BorderLayout.NORTH) 
| +--nameLabel 
| +--nameField 
+--panel2 (has GridLayout with 3 rows, 2 columns; put in BorderLayout.CENTER) 
    +--dayField 
    +--dayLabel 
    +--monthField 
    +--... 
+0

儘管如此,中心名稱標籤和文本字段vs並排元素在西部其他地方將需要一些從屬佈局。無論是GridBag整個West還是給它一個BorderLayout,其中一個面板的名稱位於北,其餘的位於另一個位於中心,每個子面板上都有一個網格佈局。 – 2009-10-20 08:33:44

+0

已編輯:)注意到當試圖創建類存根時。 – Joey 2009-10-20 08:34:50

0

從你的描述,選項1應該工作。輸入JPanel a BorderLayout,具有GridLayout s的細節,犯罪和按鈕JPanel s(分別位於西部,北部和南部)。

0

首先,你需要把一個JTabbedPane中到窗口來包含兩個選項卡(輸入和顯示),每個都包含一個JPanel。

輸入面板可以使用BorderLayout進行細分,如Joannes所描述的;另一種選擇是在Java 6中引入的GroupLayout,這是非常強大的,但很難繞過你的思想。它可以用於在一個面板中佈置整個選項卡。