PDA

View Full Version : [Java] List e Action listener


max246
08-03-2007, 10:41
mi sono fermato nel mio progetto di java, non riesco ad aggiungere a un singolo elemento del JLIST un'evento.
Io uso un modello DefaultListModel per aggiungere gli elementi e un JList che usa questo modello.

Mi potete aiutare?

PGI-Bis
08-03-2007, 12:03
Gli elementi di JList sono solo disegnati. Non sono componenti in senso pieno. Se vuoi generare un evento quando l'utente interagisce con un elemento della lista puoi "filtrare" un evento prodotto sull'intera lista. Ad esempio aggiungi alla lista un MouseListener e, quando intercetti un click, prima di reagire verifichi se il click è intervenuto in corrispondenza di una certa voce nella lista.

DvL^Nemo
08-03-2007, 12:09
mi sono fermato nel mio progetto di java, non riesco ad aggiungere a un singolo elemento del JLIST un'evento.
Io uso un modello DefaultListModel per aggiungere gli elementi e un JList che usa questo modello.

Mi potete aiutare?

lstPippo.getModel().getElementAt() e ci fai tutto quello che ti serve

max246
08-03-2007, 13:00
io ho bisogno che su ogni "voce" inserita nella Jlist, al doppio click faccia un'azione.
Ovvero come nei bottoni gli passi una classe, io vorrei dare un classe ad ogni "voce".

si puo fare?

DvL^Nemo
08-03-2007, 13:18
mialista.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent me) {
Object ob[] = mialista.getSelectedValues();
//if (ob.length > 1) return; --> Vedi se ti serve
if (me.getClickCount() == 2) {
Object[] objSelezione=mialista.getSelectedValues();
//DefaultListModel lstModel=(DefaultListModel) mialista.getModel(); --> Vedi se ti seve a qualcosa
for(int i=0;i<objSelezione.length;i++){
faiqualcosacon(objSelezione[i]);
}

}
}
});

PGI-Bis
08-03-2007, 13:35
Il motto dell'orientamento agli oggetti è "scrivi quel che pensi". Se quel che pensi funziona inevitabilmente funzionerà quello che scriverai.

Hai una lista di voci, ad ogni voce è associata un'azione, quando fai doppio click su una voce è eseguita l'azione corrispondente.

/** Elemento di una lista a cui è associata un'azione */
interface Voce {
Azione getAzione();
}

/** Qualcosa che può essere fatto. */
interface Azione {
void esegui();
}

/** Versione minima di una voce */
class VoceBase implements Voce {
final Azione azione;
final String etichetta;

VoceBase(Azione azione, String etichetta) {
this.azione = azione;
this.etichetta = etichetta;
}

/** Il metodo toString è usato dal proiettore
standard delle celle di una lista (o di una tabella) */
public String toString() {
return etichetta;
}

public Azione getAzione() {
return azione;
}
}

/** Una... lista di voci :D */
class ListaDiVoci extends JList {

public ListaDiVoci(Voce[] dati) {
super(dati);
}

public Voce getVoce(int indice) {
ListModel model = getModel();
if(indice < 0 || indice > model.getSize()) {
return null;
} else {
return (Voce)model.getElementAt(indice);
}
}
}

/** Intercetta il click su una lista di voci. Recupera la Voce
nel punto del click e invoca la sua azione. */
class Clicker extends MouseAdapter {
private ListaDiVoci list;

public void install(ListaDiVoci list) {
this.list = list;
this.list.addMouseListener(this);
}

public void uninstall() {
this.list.removeMouseListener(this);
}

public void mouseClicked(MouseEvent e) {
if(isThatClick(e)) {
doClick(e.getPoint());
}
}

private boolean isThatClick(MouseEvent e) {
return
e.getSource() == list &&
SwingUtilities.isLeftMouseButton(e) &&
e.getClickCount() == 2;
}

private void doClick(Point p) {
int index = list.locationToIndex(p);
Voce voce = list.getVoce(index);
if(voce != null) {
voce.getAzione().esegui();
}
}
}

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

/** Un tristo esempio :D */
public class Main implements Runnable {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Main());
}

public void run() {
Azione sayLo = new Azione() {
public void esegui() {
System.out.println("Hello world!");
}
};
Azione sayBye = new Azione() {
public void esegui() {
System.out.println("Bye bye world!");
}
};
Voce voceLo = new VoceBase(sayLo, "Hello");
Voce voceBye = new VoceBase(sayBye, "Bye");
Voce[] voci = { voceLo, voceBye, };
ListaDiVoci list = new ListaDiVoci(voci);
Clicker clicker = new Clicker();
clicker.install(list);
JScrollPane scroller = new JScrollPane(list);
JFrame window = new JFrame("Sample");
window.add(scroller);
window.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
window.pack();
window.setVisible(true);
}
}

Ovviamente è solo una delle rappresentazioni possibili. Tutto dipende dall'interprete.

max246
08-03-2007, 13:56
Secondo me è eccessivo quello che mi hai proposto :) ...

se aggiungo al modello questo:
public class CambiaFilm implements ActionListener {
private String id_film,nome;
public CambiaFilm(String id_film, String nome) {
this.id_film = id_film;
this.nome = nome;
}
public void actionPerformed(ActionEvent evt) {
System.out.println(id_film);
}
public String toString() {
return nome;
}


}
Ma non gli piace :/ magari perchè non devo usare l'actionlistener ma l'azione del mouse?

max246
08-03-2007, 13:59
Niente, scusate funziona...
Avevo passato un numero invece di una stringa perciò non gli piaceva...

Ora non mi funziona quando faccio il doppio click sul campo, perchè?

PGI-Bis
08-03-2007, 14:45
Un JList non genera eventi ActionEvent. Se un componente Swing è in grado di produrre un tipo di eventi XXX allora nella documentazione java si nota un metodo addXXXListener. JList non ce l'ha.

Se JList producesse ActionEvent allora potresti usare ActionListener come collegamento tra un tuo oggetto e un JList.

Se parlassimo di programmazione orientata agli oggetti ti direi di creare un sottotipo di JList che produce ActionEvent e poi usare gli oggetti che concretizzano ActionListener perchè mi sembra che tu voglia realizzare questo meccanismo.

Comunque devi passare per il tipo di eventi che la lista produce. Usiamo gli eventi del mouse perchè... be', perchè la lista li produce e il tipo di interazione utente a cui io e DvL^Nemo abbiamo pensato è quello prodotto dal doppio click del mouse. Non è l'unico genere di eventi prodotto dalla lista. Ma dovrebbe essere quello che ti interessa.

max246
08-03-2007, 14:55
Ora ho creato la classe "Clicca" ( un nome ridicolo ma vabbe ), che appena creo l'oggetto CambiaFilm nel mio modello aggiunge la lista in ascolto.

Ora per distinguere quale sia ho trovato questo:

txt_orari.getModel().getElementAt(txt_orari.getSelectedIndex())

Ma non riesco a convertirlo in string... come faccio? Con (String) mi ritrona nullo

PGI-Bis
08-03-2007, 16:44
Mmmhhh... non dovrebbe restituirti null. A meno che tu non abbia messo un null nel modello.

Cmq se vuoi un testo usa String.valueOf(...).

max246
08-03-2007, 16:48
Mmmhhh... non dovrebbe restituirti null. A meno che tu non abbia messo un null nel modello.

Cmq se vuoi un testo usa String.valueOf(...).

Perchè se faccio un println senza lo (String) esce giusto, ma quando metto lo string addio... proverò con String.value...

Grazie