无法理解这个Java GridLayout程序

时间:2010-08-17 15:37:38

标签: java

以下代码是从Java程序中提取的。程序代码非常大,所以我只是发布了所需的部分。在代码中,if (i == 2)做了什么?它检查了什么,它如何检查2?

panel.setLayout(new GridLayout(5, 4, 5, 5));

String[] buttons = {
    "Cls", "Bck", "", "Close", "7", "8", "9", "/", "4", 
    "5", "6", "*", "1", "2", "3", "-", "0", ".", "=", "+"
};


for (int i = 0; i < buttons.length; i++) {

    if (i == 2) 
        panel.add(new JLabel(buttons[i]));
    else 
        panel.add(new JButton(buttons[i]));
}

5 个答案:

答案 0 :(得分:3)

它正在创建一个4列乘5行网格并将按钮放入除第三列(偏移2)之外的所有按钮。第三个是通过在其中放置标签而留空。

所以你得到的是以下计算器布局,第三个位置没有按钮:

+-------+-------+       +-------+
|  Cls  |  Bck  |       | Close |
+-------+-------+-------+-------+
|   7   |   8   |   9   |   /   |
+-------+-------+-------+-------+
|   4   |   5   |   6   |   *   |
+-------+-------+-------+-------+
|   1   |   2   |   3   |   -   |
+-------+-------+-------+-------+
|   0   |   .   |   =   |   +   |
+-------+-------+-------+-------+

这只是一个简单的方法,可以将一个按钮列表放在一个短循环中,并带有一点点kludge,以确保布局没有任何无效的按钮。


对于它的价值,我认为以下情况会更好,这样你就不会依赖绝对位置:

panel.setLayout(new GridLayout(5, 4, 5, 5));
String[] buttons = {
    "Cls"  , "Bck"  , null   , "Close",
    "7"    , "8"    , "9"    , "/"    ,
    "4",   , "5"    , "6"    , "*"    ,
    "1"    , "2"    , "3"    , "-"    ,
    "0"    , "."    , "="    , "+"
};

for (int i = 0; i < buttons.length; i++) {
    if (buttons[i] == null)
        panel.add(new JLabel(""));
    else 
        panel.add(new JButton(buttons[i]));
}

这只依赖于一条信息,即buttons数组中的一条信息。当然,它假设你只想要空白标签,但在这种情况下,它没关系,因为这就是他们所用的全部。

答案 1 :(得分:1)

鉴于int ii == 2评估为true当且仅当i恰好包含值2.否则为false

因此:

if (i == 2) {
   // code executed if i has the value 2
} else {
   // code executed if i does NOT have the value 2
}

请注意,数组是零索引的。所以鉴于此声明:

String[] buttons = {
    "Cls", "Bck", "", "Close", "7", "8", "9", "/", "4", 
    "5", "6", "*", "1", "2", "3", "-", "0", ".", "=", "+"
};

我们有:

  • buttons[0].equals("Cls")
  • buttons[1].equals("Bck")
  • buttons[2].isEmpty()

因此整个for循环遍历String[] buttons中的每个元素,并且对于除索引2之外的每个元素(这些元素恰好是非空字符串的元素),它添加了面板上带有该标签的JButton。对于索引2处的元素(恰好是空字符串),它会添加JLabel

请注意,GridLayoutconstructor used下有5行4列,所以代码基本上会创建以下布局:

    _______________________________
   |       |       |       |       |
   |  Cls  |  Bck  |<blank>| Close |
   |_______|_______|_______|_______|
   |       |       |       |       |
   |   7   |   8   |   9   |   /   |
   |_______|_______|_______|_______|
   |       |       |       |       |
   |   4   |   5   |   6   |   *   |
   |_______|_______|_______|_______|
   |       |       |       |       |
   |   1   |   2   |   3   |   -   |
   |_______|_______|_______|_______|
   |       |       |       |       |
   |   0   |   .   |   =   |   +   |
   |_______|_______|_______|_______|

A println示例

要了解for循环逻辑本身,请考虑以下代码段:

    String[] buttons = {
        "Cls", "Bck", "", "Close",
        "7", "8", "9", "/",
        "4", "5", "6", "*",
        "1", "2", "3", "-",
        "0", ".", "=", "+"
    };
    for (int i = 0; i < buttons.length; i++) {
        if (i == 2) {
            System.out.println(buttons[i]);
        } else {
            System.out.println("[" + buttons[i] + "]");
        }
    }

以上打印(as seen on ideone.com):

[Cls]
[Bck]

[Close]
[7]
[8]
[9]
[/]
[4]
[5]
[6]
[*]
[1]
[2]
[3]
[-]
[0]
[.]
[=]
[+]

返回GridLayout,在上面的代码段中打印字符串的顺序也是将组件添加到Panel中的顺序,从左到右,从顶部开始到底的订单(即row-major订单)。

答案 2 :(得分:1)

鉴于这一行:

for (int i = 0; i < buttons.length; i++) {

for语句在值i处创建变量0。然后,对于数组{中的每个值(列表结构),它在}buttons之间运行一次代码,每次增加变量i

第一次,行if (i == 2)将失败,因为i仍为0,然后在else语句后调用代码。这会添加一个包含文本Cls的按钮。

第三次通过代码,变量i将为2(因为它从零开始),然后它将在if (i == 2)之后运行 - 因为这就是它确实

然后它将添加一个空标签(数组buttons中的第三个条目,数组从第一个位置的0开始。)而不是按钮。

我建议您查看the Java tutorials以获取有关其语言和结构的更多信息。 :)

答案 3 :(得分:0)

String[] buttons定义要在面板上布局的一组按钮上显示的文本(看起来像计算器程序)。请注意,第三个条目(索引2)是一个空字符串""。您列出的代码会在该位置插入空标签而不是按钮。

答案 4 :(得分:0)

创建计算器键盘。 将第一行中的第三列保留为带有空文本的JLable。

哇有人已经把它看起来如何。这应该回答所有问题。