PDA

View Full Version : [JAVA] JComboBox in ArrayList


pumax84
13-10-2008, 18:02
Salve a tutti,
sto sviluppando un'applicazione nella quale è possibile aggiungere delle "Attività" dove ognuna ha vari campi di inserimento dati.

Screenshot di riferimento:
http://img232.imageshack.us/img232/456/screen2lj2.jpg

Avrei bisogno di implementare un ItemListener in modo da far corrispondere un'azione quando si cambia l'item di una delle JComboBox. Ogni attività è memorizzata in un ArrayList e i campi di ciascuna attività a sua volta sono memorizzati in altri ArrayList (uno per ogni attività).

Nel momento in cui si ha una JComboBox è evidente che il listener può riferirsi solo a lei, ma in questo caso? Ho necessità di farmi restituire il numero di attività per la quale è stato scatenato l'evento dalla corrispondente JComboBox. Ci sto sbattendo la testa da ieri, ma fino ad ora non ne sono venuto a capo. Qualche idea?

Grazie anticipatamente.

Ciao,
Francesco

banryu79
13-10-2008, 18:38
Immagino il listener che ti interessi sia l'actionListener.
Puoi recuperare il componente che ha scatenato l'evento in questo modo:

Tipo:

// l'actionListener dei JComboBox:
public void actionPerformed(ActionEvent e) {
JComboBox cb = (JComboBox)e.getSource();
// ...
}


a quel punto devi solo cercare nel tuo ArrayList (o quello che hai usato) di JComboBox quello giusto.

pumax84
13-10-2008, 18:57
Ciao banryu, innanzitutto ancora grazie per la tua disponibilità! :)

Allora, il listener interessato è l'ItemListener (ho bisogno di passare ad un metodo sia l'indice dell'attività, sia l'item selezionato).

Avevo già pensato di recuperare l'evento in quel modo, in seguito però mi son "bloccato" sull'indexOf dell'Array dell'attività, o meglio avevo scritto:

int index = activitiesArray.indexOf((JComboBox)item.getSource());

Come puoi notare è errato (avendo una matrice e non solo un vettore) perchè come argomento del metodo indexOf andrebbe inserito l'array contenente la JComboBox che ha scatenato l'evento e non solo la JComboBox. Il problema è che siccome le attività possono essere indefinite, di conseguenza quando ho creato gli oggetti ArrayList all'interno dell'ArrayList activitiesArray non ho assegnato loro un nome.

Per spiegarmi meglio:


ArrayList activitiesArray = new ArrayList();

//Ogni attività viene aggiunta in questo modo:
activitiesArray.add(new ArrayList());


In definitiva ora non so come richiamare quel bel new ArrayList() (senza nome) all'interno di indexOf().

pumax84
13-10-2008, 20:09
Ok, risolto con una semplice ricerca ciclica. Incollo tutto il codice relativo al listener, nel caso possa tornare utile a qualcuno! :)


class DistributionListener implements ItemListener {

public void itemStateChanged (ItemEvent item) {

int index = -1;
String itemSelected = (item.getItem()).toString();

for(int i=0; i<activitiesNumber;i++) {

if((JComboBox)((ArrayList)activitiesArray.get(i)).get(3) == ((JComboBox)item.getSource()))
index = i;

}

paramChanging(index, itemSelected);

//Refresh MainPanel
repaint();

}

}