View Full Version : [JAVA] Aiutatemi sul Listener
Easlay93
24-02-2015, 10:41
tblCalendar.setCellSelectionEnabled(true);
ListSelectionModel cellSelectionModel = tblCalendar.getSelectionModel();
cellSelectionModel.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
cellSelectionModel.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
Integer selectedData = 0;
int[] selectedRow = tblCalendar.getSelectedRows();
int[] selectedColumns = tblCalendar.getSelectedColumns();
for (int i = 0; i < selectedRow.length; i++) {
for (int j = 0; j < selectedColumns.length; j++) {
System.out.println("for"+selectedData+" "+selectedColumns.length);
selectedData = (Integer) tblCalendar.getValueAt(selectedRow[i], selectedColumns[j]);
}
System.out.println("ciao"+selectedData);
}
}
});
sapete come mail il listener mi viene richiamato 6 volte?
[Kendall]
24-02-2015, 11:09
tblCalendar.setCellSelectionEnabled(true);
ListSelectionModel cellSelectionModel = tblCalendar.getSelectionModel();
cellSelectionModel.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
cellSelectionModel.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
Integer selectedData = 0;
int[] selectedRow = tblCalendar.getSelectedRows();
int[] selectedColumns = tblCalendar.getSelectedColumns();
for (int i = 0; i < selectedRow.length; i++) {
for (int j = 0; j < selectedColumns.length; j++) {
System.out.println("for"+selectedData+" "+selectedColumns.length);
selectedData = (Integer) tblCalendar.getValueAt(selectedRow[i], selectedColumns[j]);
}
System.out.println("ciao"+selectedData);
}
}
});
sapete come mail il listener mi viene richiamato 6 volte?
Se sostituisci l'intero corpo del metodo ValueChanged con un semplice println, quante volte ti viene stampato?
Giusto per fare un pò di debug a monte e capire meglio la situazione.
Easlay93
24-02-2015, 12:52
6 volte
deadbeef
24-02-2015, 14:13
è per caso un pezzo di codice di una classe controller di una pagina JSF?
Daniels118
24-02-2015, 14:42
Se sostituisci l'intera chiamata a addListSelectionListener con un semplice println, quante volte ti viene stampato?
Easlay93
24-02-2015, 15:22
è per caso un pezzo di codice di una classe controller di una pagina JSF?
non so cosa stai dicendo
Se sostituisci l'intera chiamata a addListSelectionListener con un semplice println, quante volte ti viene stampato?
sempre 6 volte
Daniels118
24-02-2015, 15:33
A questo punto mi sembra evidente: hai aggiunto 6 listener, quando si verifica l'evento vengono invocati tutti e 6.
Easlay93
24-02-2015, 16:51
Sbagliato ho solo un listener solo che mi viene richiamato 6 volte
Daniels118
24-02-2015, 20:51
Se hai sostituito questo blocco di codice
cellSelectionModel.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
Integer selectedData = 0;
int[] selectedRow = tblCalendar.getSelectedRows();
int[] selectedColumns = tblCalendar.getSelectedColumns();
for (int i = 0; i < selectedRow.length; i++) {
for (int j = 0; j < selectedColumns.length; j++) {
System.out.println("for"+selectedData+" "+selectedColumns.length);
selectedData = (Integer) tblCalendar.getValueAt(selectedRow[i], selectedColumns[j]);
}
System.out.println("ciao"+selectedData);
}
}
});
con una print, e hai ottenuto 6 volte l'output, significa che hai aggiunto 6 listener. Anche se il codice dei listener è identico, sono comunque oggetti distinti (lo dice la parola "new"). Del resto il metodo si chiama "add***Listener", non "set***Listener".
Easlay93
24-02-2015, 22:15
quindi devo usare un set?
[Kendall]
24-02-2015, 23:59
quindi devo usare un set?
Oddio dipende. L'hai aggiunto oppure no 6 volte quel listener? (come ha ipotizzato Daniels118)
Perché in caso affermativo basta solo che revisioni il tuo codice e fai in modo di aggiungere il listener solo una volta.
Daniels118
25-02-2015, 08:40
quindi devo usare un set?
Dicevo per dire, non so se quella classe abbia un metodo setListSelectionListener, la soluzione corretta sarebbe quella di aggiungere un solo listener come già detto da [Kendall]. Un workaround potrebbe essere quello di rimuovere tutti i listener prima di aggiungere il nuovo, ma è un metodo fortemente sconsigliato.
PS. guarda sempre il javadoc per sapere di quali metodi dispone una classe e cosa fanno esattamente.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.