【问题标题】:Adding JButtons to a Panel that Have the Same Name Yet They Are Different. Why? (Java) (Swing)将 JButton 添加到具有相同名称但它们不同的面板中。为什么? (Java) (摇摆)
【发布时间】:2016-04-19 15:13:54
【问题描述】:

我正在开发一个虚拟项目,该项目根据 ArrayList 中包含的按钮数量添加 x 个按钮。

以下代码在每次执行for 循环块时创建一个new 按钮,并将其添加到名为listOfButtonsArrayList

for (i = 0; i < 10; i++) {
        JButton button = new JButton("Record " + String.valueOf(i + 1));
        button.setAlignmentX(Component.CENTER_ALIGNMENT);
        listOfButtons.add(button);

    }

然后我只需将listOfButtons 中包含的按钮添加到面板中。

for (int i = 0; i < 10; i++) {
        panel.add(listOfButtons.get(i));
    }

有了这个上下文;我的问题是为什么以及如何创建具有相同名称的唯一按钮对象是合法的:button。我一直将对象创建理解为:当程序员创建一个与另一个引用变量同名的新对象引用变量时,新的引用变量将指向内存中不同的单个对象。

【问题讨论】:

  • 当您在循环中创建一个新按钮时,该按钮是“本地”定义的。这意味着在每次迭代中,名为“button”的旧变量是未知的(除非您的列表中存在对它的引用。)。结果是列表中的每个条目都有唯一的引用,但条目本身没有名称。我希望一切顺利!
  • 感谢大家的精彩回答。我赞成所有人,但由于我的声誉,它们不可见。

标签: java swing object


【解决方案1】:

引用button 的范围是for 正文。在每次迭代中,引用都是一个新引用,因此是 JButton button 部分。您也在创建新对象,因此是new JButton(...)。您还让新的引用指向同一行上新创建的对象,因此=(赋值运算符)。

我们只讨论重复的引用声明,而不是赋值或对象创建。

这是非法的:

JButton button;
JButton button;

还有这个:

{
    JButton button;
    {
        JButton button;
    }
}

这是合法的:

{
    JButton button;
}

{
    JButton button;
}

这是因为引用是在不相交的范围内声明的。

【讨论】:

    【解决方案2】:

    这与对象范围有关。每次 for 循环迭代完成后,范围现在已更改,因此名称为 button 的新 Button 具有不同的范围。

    这与你可以拥有两个具有相同变量名的方法非常相似。

    public void method1() {
        int value = 0;
    }
    
    public void method2() {
        int value = 1;
    }
    

    由于范围不同,这两个变量也是允许的。

    在每次 for 循环迭代结束时,button 变量引用被丢弃。该列表可能仍在查看它,但无法通过名称button 引用它

    【讨论】:

      【解决方案3】:

      button 引用了新创建的JButton。如果您通过创建另一个 JButton 为其分配新引用来更改按钮上的引用,这并不意味着前一个将被删除。

      你也可以这样做,效果是一样的

      listOfButtons.add(new JButton("new Button created without assigning it somewhere"));
      

      【讨论】:

        猜你喜欢
        • 2010-11-25
        • 1970-01-01
        • 1970-01-01
        • 2012-10-03
        • 2019-10-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多