1

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

我有一个调用 Panel 类的 Window 类,而 Panel 类调用 InputPanel 和 DisplayPanel 类。我的 InputPanel 类调用了我的 DetailsPanel、CrimePanel 和 ButtonPanel 类,因此它们构成了 Input 选项卡下的内容。有人告诉我对整个窗口使用 BorderLayout,DetailsPanel(左面板)和 CrimePanel 应该是 GridLayout。

这是否意味着我应该:

  1. 将 BorderLayout 代码放在 Panel 中,将 GridLayout 代码放在 CrimePanel 和 DetailsPanel 中或
  2. 把BorderLayout代码放在Window里,把GridLayout代码放在Panel里?

替代文字 http://img137.imageshack.us/img137/6422/93381955.jpg

4

3 回答 3

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
   +--...
于 2009-10-20T08:27:44.710 回答
0

根据您的描述,选项 1 应该有效。给输入JPanela BorderLayout,其中 Details、Crime 和 Button JPanels(分别在西部、北部和南部)具有GridLayouts。

于 2009-10-20T08:24:00.703 回答
0

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

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

于 2009-10-20T08:56:30.020 回答