自动迭代相同类型的所有类成员?

时间:2014-09-26 08:41:40

标签: java reflection

我有以下代码:

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个JSpinner,10个JComboBox和40个JCheckBox,它们都希望以相同的方式进行控制。

我能想到的唯一解决方案是为其他49个JSpinner复制并粘贴此代码,为其他三种类型的输入生成类似的代码,然后复制并粘贴每个代码的代码,像这样的东西:

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. 然后能够动态引用该类的不同实例的同一成员。

  3. 或者,我需要一个解决这个问题的新方法。

    我希望我的帖子很清楚。如果没有,请随时要求澄清。谢谢!

1 个答案:

答案 0 :(得分:0)

您的伪代码可以像这样直接翻译成Java:

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