简体   繁体   中英

Append a number in the end of a variable name in java

Suppose that I have a lot of variables defined in my code with names such as this

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

So their general type is like this: BenderPanel"NUMBER" .

I want to access some of them and set their visibility with .setVisible(false); but the number of those panels which I want to access is user-defined on run time.

Is there any possible way through a library to append a number to the end of each variable in order to access it in a for loop, like this:

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

WITHOUT the need to add them on ArrayList first and do it with the obvious way?

You can't create members dynamically in Java (you can access them dynamically via reflection, but there's no need for it here).

Rather than having

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

have

public javax.swing.JPanel[] BenderPanels;

or

public List<javax.swing.JPanel> BenderPanels;

Then you can loop through them with an enhanced for loop.

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

If you really do not want to store your objects in a data structure like eg an ArrayList, I would recommend to use the Reflection API .

Especially interesting for you should be the fields .

Btw: According to the Java Naming Conventions , variable names shouldn't start with capital letters.

I'll provide you an idea about using 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);
    }
}

}

Use Reflection in that Way:

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

Maybe it will help.

Simple example using your setup:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM