我有以下代碼:自動遍歷相同類型的所有類成員?
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
}
}
要改寫這個問題,我想我需要兩個工具:
遍歷所有的能力某個類的特定實例的成員並查找匹配。
然後能夠動態引用該類的不同實例的相同成員。
或者,我需要一個新的解決方案來解決這個問題。
我希望我的帖子很明確。如果不是,請隨時要求澄清。謝謝!