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などのデータ構造にオブジェクトを格納したくない場合は、ReflectionAPIを使用することをお勧めします。

あなたにとって特に興味深いのはフィールドです。

ところで:Javaの命名規則によれば、変数名は大文字で始めるべきではありません。

于 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

そのようにReflectionを使用します。

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 に答える
-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 に答える