【问题标题】:Append a number in the end of a variable name in java在java中的变量名末尾附加一个数字
【发布时间】:2013-01-01 23:39:24
【问题描述】:

假设我在代码中定义了很多变量,名称如下

public javax.swing.JPanel BenderPanel1;
public javax.swing.JPanel BenderPanel2;
public javax.swing.JPanel BenderPanel3;
etc...

所以他们的一般类型是这样的:BenderPanel"NUMBER"

我想访问其中的一些并使用.setVisible(false); 设置它们的可见性,但我想访问的那些面板的数量是用户在运行时定义的。

是否有任何可能的方法通过库将数字附加到每个变量的末尾,以便在 for 循环中访问它,如下所示:

for (int i=1; i<=UserInput; i++)
{
     BenderPanel"i".setVisible(false); // Watch this "i" right there.
}

没有需要先将它们添加到ArrayList 并以明显的方式进行?

【问题讨论】:

  • 用数组代替这种方式,数组就是你所需要的
  • (也不要使用公共变量...)

标签: java variables append variable-names


【解决方案1】:

你不能在 Java 中动态地创建成员(你可以通过反射来动态地访问它们,但是这里不需要它)。

而不是拥有

public javax.swing.JPanel BenderPanel1;
public javax.swing.JPanel BenderPanel2;
public javax.swing.JPanel BenderPanel3;

public javax.swing.JPanel[] BenderPanels;

public List<javax.swing.JPanel> BenderPanels;

然后您可以使用增强的for 循环遍历它们。

for (javax.swing.JPanel panel : BenderPanels) {
    // ...
}

【讨论】:

  • 如果他可以使用反射,为什么他不能在 Java 中做到这一点?
  • @emka86:您不能使用反射动态创建新变量。您可以使用反射访问对象实例的现有数据成员,但确实如此。
  • 是的,确实如此,但您在编辑之前的回答只是说他“不能在 Java 中做到这一点”
【解决方案2】:

如果您真的不想将对象存储在数据结构中,例如一个 ArrayList,我建议使用 Reflection API

你应该特别感兴趣的是fields

顺便说一句:根据Java Naming Conventions,变量名不应以大写字母开头。

【讨论】:

  • 感谢您的回答。还要感谢您提醒我 JavaNamingConventions,除了 GUI 设计,我几乎在所有地方都使用它:D
【解决方案3】:

我会给你一个关于使用Reflection的想法:

public class YourClassContainer extends ... {

public javax.swing.JPanel BenderPanel1;
public javax.swing.JPanel BenderPanel2;
public javax.swing.JPanel BenderPanel3;
....
public javax.swing.JPanel BenderPanelXXX;

....

//to access all of them:

for (Field field : YourClassContainer.class.getFields()) {
    if (field.getName().startsWith("BenderPanel")) {
        ((javax.swing.JPanel)field.get(YourClassContainer.this)).setVisible(false);
    }
}

}

【讨论】:

  • 嗯,这肯定比ArrayList 看起来更丑,代码也更多,所以我会选择ArrayList。为示例 +1。
【解决方案4】:

以这种方式使用反射:

YourClasss instance; // this instance has those all JPanel fields
Method setVisible = JPanel.class.getMethod("setVisible", new Class[] {Boolean.class});

List<String> numberOfFieldList = getNumbersOfFieldsToSetInvisible(); 

for (String number : numerOfFieldList) {
  Field benderPanelField = YourClass.getField("BenderPanel" + number);
  Object fieldInYourInstance = benderPanelField.get(instance);
  setVisible.invoke(fieldInYourInstance, Boolean.FALSE);
}

也许会有所帮助。

【讨论】:

    【解决方案5】:

    使用您的设置的简单示例:

        List<Integer> visibleItems = new ArrayList<Integer>();
    
        JPanel[] myPanels = new JPanel[]{BenderPanel1, BenderPanel2, BenderPanel3};
    
        for (int i = 0; i < myPanels .length; i++) {
            myPanels[i].setVisible(false);
            if(visibleItems.contains(i) ){
                myPanels[i].setVisible(true);
            } 
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-16
      • 2013-08-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多