我有以下代码:自动遍历相同类型的所有类成员?
public void valueChanged(ChangeEvent ce, int index, Level previousState) {
Object source = ce.getSource();
LevelEditorPanel currentPanel = levelPanels.get (index);
//currentPanel.columns is a JSpinner
if (source == currentPanel.columns) {
for (int k = index + 1; k < levelPanels.size(); k++) {
LevelEditorPanel targetPanel = levelPanels.get(k);
if(((Integer) targetPanel.columns.getValue()).intValue() == previousState.columns) {
targetPanel.columns.setValue((Integer) currentPanel.columns.getValue());
}
}
}
}
实际的代码是约35线;我简化了这篇文章。
本质上,它监听一个变化,它在LevelEditorPanel的实例A中标识哪个组件发生了变化,然后更新LevelEditorPanel的实例B到Z中的相同组件以匹配实例A.(在上面的代码中未显示,它仅有时更新B到Z,取决于用户设置的布尔值)。
该代码对于一个组件来说不太难处理。但是我在“LevelEditorPanel”中有大约50个JSpinners,10个JComboBox和40个JCheckBox,它们都希望以相同的方式进行控制。
我能想到的唯一解决方案是为其他49个JSpinners中的每一个复制和粘贴此代码,为其他三种类型的输入生成类似的代码,然后复制并粘贴每个代码,像这样:
if (source == currentPanel.columns) {
//Paste 35 lines
} else if (source == currentPanel.rows) {
//Paste 35 lines, change all references to 'columns' to 'rows'
} else if (source == currentPanel.speed) {
//etc
这将是成千上万的行真正难以管理的代码。
我正在寻找更好的解决方案。在伪代码,我想要做这样的事情:
foreach (JSpinner theSpecificSpinner defined in LevelEditorPanel) {
if (source == currentPanel.theSpecificSpinner) {
target.theSpecificSpinner.setValue (currentValue);
//etc
}
}
要改写这个问题,我想我需要两个工具:
遍历所有的能力某个类的特定实例的成员并查找匹配。
然后能够动态引用该类的不同实例的相同成员。
或者,我需要一个新的解决方案来解决这个问题。
我希望我的帖子很明确。如果不是,请随时要求澄清。谢谢!