5

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

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并以明显的方式进行吗?

4

5 回答 5

5

您不能在 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) {
    // ...
}
于 2013-01-18T09:35:37.877 回答
2

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

对你来说特别有趣的应该是领域

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

于 2013-01-18T09:34:54.233 回答
0

我将为您提供有关使用的想法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);
    }
}

}
于 2013-01-18T09:38:25.070 回答
-1

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

    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);
        } 
    }
于 2013-01-18T09:47:52.293 回答
-1

以这种方式使用反射:

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);
}

也许会有所帮助。

于 2013-01-18T09:41:16.633 回答