|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: May 2005
Messaggi: 340
|
[Java] List e Action listener
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? |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
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.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Nov 2001
Città: 100 metri dal mare
Messaggi: 4855
|
lstPippo.getModel().getElementAt() e ci fai tutto quello che ti serve
|
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: May 2005
Messaggi: 340
|
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? |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Nov 2001
Città: 100 metri dal mare
Messaggi: 4855
|
Codice:
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]); } } } }); |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
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. Codice:
/** Elemento di una lista a cui è associata un'azione */ interface Voce { Azione getAzione(); } Codice:
/** Qualcosa che può essere fatto. */ interface Azione { void esegui(); } Codice:
/** 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; } } Codice:
/** 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); } } } Codice:
/** 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(); } } } Codice:
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); } }
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: May 2005
Messaggi: 340
|
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? |
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: May 2005
Messaggi: 340
|
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è? |
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
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.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: May 2005
Messaggi: 340
|
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: Codice:
txt_orari.getModel().getElementAt(txt_orari.getSelectedIndex()) |
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Mmmhhh... non dovrebbe restituirti null. A meno che tu non abbia messo un null nel modello.
Cmq se vuoi un testo usa String.valueOf(...).
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
![]() |
![]() |
![]() |
#12 | |
Senior Member
Iscritto dal: May 2005
Messaggi: 340
|
Quote:
Grazie |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 13:43.