Вы можете выполнить итерацию по дереву Component
s, проверив, является ли каждый Component
экземпляром Container
, и, если это так, выполнить итерацию по дочерним компонентам контейнера и так далее.Вы можете обернуть эту функцию в ComponentIterator
, который инициализируется с корневым Компонентом в иерархии.Это позволит вам выполнить итерацию по дереву компонентов и инициализировать каждое JComboBox
определенным значением.
Однако , я бы не рекомендовал этот «общий» подход, поскольку он мог бы привести к непредвиденным результатам.как ваш код развивается с течением времени.Вместо этого, возможно, имеет смысл написать простой фабричный метод, который создает и инициализирует ваш JComboBox
;Например,
private JComboBox createCombo(Object[] items) {
JComboBox cb = new JComboBox(items);
if (items.length > 0) {
cb.setSelectedIndex(0);
}
return cb;
}
Вот реализация ComponentIterator
на случай, если она будет полезна:
public class ComponentIterator implements Iterator<Component> {
private final Stack<Component> components = new Stack<Component>();
/**
* Creates a <tt>ComponentIterator</tt> with the specified root {@link java.awt.Component}.
* Note that unless this component is a {@link java.awt.Container} the iterator will only ever return one value;
* i.e. because the root component does not contain any child components.
*
* @param rootComponent Root component
*/
public ComponentIterator(Component rootComponent) {
components.push(rootComponent);
}
public boolean hasNext() {
return !components.isEmpty();
}
public Component next() {
if (components.isEmpty()) {
throw new NoSuchElementException();
}
Component ret = components.pop();
if (ret instanceof Container) {
for (Component childComponent : ((Container) ret).getComponents()) {
components.push(childComponent);
}
}
return ret;
}
public void remove() {
throw new UnsupportedOperationException();
}
}