在GUI中使用不同的布局

时间:2009-10-20 08:01:53

标签: java user-interface layout grid-layout

这是我的程序应该是什么样子,我对使用不同布局的地方有点困惑。

我有一个Window类,它调用Panel类,Panel类调用InputPanel和DisplayPanel类。我的InputPanel类调用我的DetailsPanel,CrimePanel和ButtonPanel类,以便它们构成在Input选项卡下看到的内容。我被告知在整个窗口中使用BorderLayout,而DetailsPanel(左侧面板)和CrimePanel应该是GridLayout。

这是否意味着我应该:

  1. 将BorderLayout代码放在Panel中,GridLayout代码放在CrimePanel和DetailsPanel或
  2. 将BorderLayout代码放在Window中,将GridLayout代码放在Panel?
  3. alt text http://img137.imageshack.us/img137/6422/93381955.jpg

3 个答案:

答案 0 :(得分: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
   +--...

答案 1 :(得分:0)

根据您的描述,选项1应该有效。输入JPanel一个BorderLayout,其中详细信息,犯罪和按钮JPanel(分别位于西部,北部和南部)GridLayout

答案 2 :(得分:0)

首先,您需要将一个JTabbedPane放入Window中以包含两个选项卡(输入和显示),每个选项卡包含一个JPanel。

Joannes描述的输入面板可以使用BorderLayout进行细分;另一个替代方案是Java 6中引入的GroupLayout,它非常强大,但很难将你的思想包裹起来。它可以用于在一个面板中布局整个选项卡。