2009-10-20 78 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,这是非常强大的,但很难绕过你的思想。它可以用于在一个面板中布置整个选项卡。