我有以下代码:
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
}
}
要重新解释这个问题,我想我需要两个工具:
能够迭代类的特定实例的所有成员并查找匹配项。
然后能够动态引用该类的不同实例的同一成员。
或者,我需要一个解决这个问题的新方法。
我希望我的帖子很清楚。如果没有,请随时要求澄清。谢谢!
答案 0 :(得分:0)
您的伪代码可以像这样直接翻译成Java:
Component[] components = currentPanel.getComponents();
for (component: components) {
if (component == source && component instanceof JSpinner) {
((JSpinner)component).setValue(currentValue);
}
}