2014-09-26 2 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 линий; Я немного упростил это сообщение.

По существу, он прослушивает изменение, он идентифицирует, какой компонент был изменен в экземпляре A LevelEditorPanel, а затем обновляет один и тот же компонент в экземплярах от B до Z уровня LevelEditorPanel, чтобы соответствовать экземпляру A. (Не показано в приведенном выше коде, это только иногда обновляет B через Z, в зависимости от логических значений, заданных пользователем).

Код не слишком громоздкий для одного компонента. Но у меня около 50 JSpinners, 10 JComboBox и 40 JCheckBox в «LevelEditorPanel», которые все хотят контролировать одним и тем же способом.

Единственное решение, о котором я могу думать, это скопировать и вставить этот код для каждого из 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 

, который будет тысячами строк, которые действительно сложны в управлении кодом.

Я ищу лучшее решение. В psuedocode, я хотел бы сделать что-то вроде этого:

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); 
    } 
} 
Смежные вопросы