在java中,在变量名的末尾追加一个数字
假设我在代码中定义了许多变量,其名称如下在java中,在变量名的末尾追加一个数字,java,variables,append,variable-names,Java,Variables,Append,Variable Names,假设我在代码中定义了许多变量,其名称如下 public javax.swing.JPanel BenderPanel1; public javax.swing.JPanel BenderPanel2; public javax.swing.JPanel BenderPanel3; etc... 所以它们的一般类型如下:BenderPanel“NUMBER” 我想访问其中一些,并使用.setVisible(false)设置它们的可见性但是我想要访问的面板的数量是在运行时由用户定义的 通过库是否有
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.
}
for(int i=1;i如果您真的不想将对象存储在数据结构(例如ArrayList)中,我建议使用
对你来说特别有趣的应该是
顺便说一句:根据,变量名不应该以大写字母开头。您不能在Java中动态创建成员(您可以通过反射动态访问它们,但这里不需要)
而不是
public javax.swing.JPanel BenderPanel1;
public javax.swing.JPanel BenderPanel2;
public javax.swing.JPanel BenderPanel3;
有
或
我将向您介绍如何使用反射:
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);
}
}
}
以这种方式使用反射:
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);
}
yourclass实例;//此实例包含所有JPanel字段
方法setVisible=JPanel.class.getMethod(“setVisible”,新类[]{Boolean.class});
List numberOfFieldList=GetNumberOffieldStosetInvisible();
用于(字符串编号:numerOfFieldList){
Field benderPanelField=YourClass.getField(“BenderPanel”+数字);
Object fieldInYourInstance=benderPanelField.get(实例);
调用(fieldInYourInstance,Boolean.FALSE);
}
可能会有所帮助。使用您的设置的简单示例:
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);
}
}
List visibleItems=new ArrayList();
JPanel[]myPanels=新的JPanel[]{BenderPanel1,BenderPanel2,BenderPanel3};
对于(int i=0;i
使用数组而不是这样做,数组是您需要的(也不要使用公共变量…)谢谢你的回答。也谢谢你提醒我JavaNamingConventions,除了GUI设计之外,我几乎在所有地方都使用它:这看起来肯定比ArrayList
更难看,代码也更多,所以我就以ArrayList
+1为例。如果他可以用反射,为什么他不能用Java做这件事呢?@emka86:你不能使用反射动态创建新变量。您可以使用反射访问对象实例的现有数据成员,这是真的。是的,这是真的,但您在编辑之前的回答只是说他“不能在Java中这样做”
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);
}
}
}
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);
}
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);
}
}