2014-09-26 71 views
0

我有以下代碼:自動遍歷相同類型的所有類成員?

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

要改寫這個問題,我想我需要兩個工具:

  1. 遍歷所有的能力某個類的特定實例的成員並查找匹配。

  2. 然後能夠動態引用該類的不同實例的相同成員。

或者,我需要一個新的解決方案來解決這個問題。

我希望我的帖子很明確。如果不是,請隨時要求澄清。謝謝!

回答

0

你的僞代碼可直譯爲Java這樣的:

Component[] components = currentPanel.getComponents(); 
for (component: components) { 
    if (component == source && component instanceof JSpinner) { 
     ((JSpinner)component).setValue(currentValue); 
    } 
}