2014-09-26 72 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); 
    } 
}