PDA

Visualizza la versione completa : [Java] JList ed eventi


valer_85
16-06-2005, 18:36
Salve a tutti! il mio problema questo: ho una JList con varie voci, e 1 pulsante. quando scelgo una voce dalla JList, premendo il pulsante dovrebbe rimuovere la voce selezionata (ke poi corrisponderebbe a rimuovere un campo da un ArrayList)... devo gestire tutto ci con ascoltatori esterni...come posso fare? se pu servire ecco il codice:




package es02;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import javax.swing.event.ListSelectionEvent;

public class RimozFrame extends JFrame implements ActionListener {
private JButton b1,b2,b3;
private JLabel l1;
private JList c1;
private JTextField t1;
private JScrollPane pane;
private Box riga1,riga2,col1,col2;
private ProfFrame parent;
public RimozFrame(ProfFrame parent){

this.parent=parent;

setTitle("Rimozione/Modifica appello");
setBounds(50,50,700,400);
Container cp = getContentPane();
JPanel mainPanel = new JPanel();

b2 = new JButton("Modifica");
b3 = new JButton("Rimuovi");

c1 = new JList();

String[] s = new String[parent.getGest().esamiSize()];
try{
Wex w = parent.getGest();
Appello[] ap = w.visualElenco();

for(int i=0;i<ap.length;i++){
s[i] = ap[i].toString();
}
} catch (Exception ex){
}
if(s.length==0){
JLabel l = new JLabel("Non ci sono appelli!");
mainPanel.add(l);
}
c1 = new JList(s);
pane = new JScrollPane(c1);
c1.setVisibleRowCount(10);
t1=new JTextField(20);

col1=new Box(BoxLayout.Y_AXIS);
col1.add(c1);
col1.add(Box.createHorizontalStrut(10));
col2=new Box(BoxLayout.Y_AXIS);
col2.add(b2);
col2.add(Box.createVerticalStrut(30));
col2.add(b3);

mainPanel.add(col1);
mainPanel.add(col2);

b3.addActionListener(new RimozListener(this));

cp.add(mainPanel);

}

public void actionPerformed(ActionEvent e) {

}

public void valueChanged(ListSelectionEvent e){

}

}


grazie

:ciauz:

LeleFT
16-06-2005, 19:35
Non ho provato, ma potresti gestire la cosa in questo modo...
nel codice del pulsante ( actionPerformed() ):

1) Ricavi l'indice della voce selezionata
2) In una variabile ricavi l'oggetto selezionato
3) Rimuovi l'oggetto selezionato dalla JList
4) Rimuovi l'oggetto dall'ArrayList

Puoi tranquillamente utilizzare un codice come questo:


// Ricavo l'indice dell'elemento selezionato:
int indice = miaJList.getSelectedIndex();

// Ricavo l'oggetto selezionato
MioOggetto oggetto = (MioOggetto) miaJList.getSelectedValue();

// Rimuovo l'oggetto selezionato:
miaJList.removeSelectionInterval(indice, indice);

// Rimuovo l'oggetto dall'ArrayList
int indice = miaArrayList.indexOf(oggetto);
miaArrayList.remove(indice);

Ciao. :ciauz:

valer_85
17-06-2005, 00:24
t ringrazio molto x la tua risposta sempre pronta, domani provo e t dico...ciao ciao :ciauz:

valer_85
17-06-2005, 12:09
si ma il listener mi serve esterno, nn interno alla classe del frame, xk poi c' anke un altro pulsante da gestire quindi li gestisco tutti e 2 con 2 listeners esterni...

valer_85
17-06-2005, 12:26
cmq ho provato col tuo modo, quando seleziono l'item nella JList mi d quest'eccezione, forse riguarda il cast... boh... :




public void valueChanged(ListSelectionEvent e){
int indice = c1.getSelectedIndex();
Appello app = (Appello) c1.getSelectedValue();
c1.removeSelectionInterval(indice, indice);
int indice2 = parent.getGest().getEsami().indexOfapp);
parent.getGest().getEsami().remove(indice2);

}


l'eccezione ke mi d :

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.lang.String
at es02.RimozFrame.valueChanged(RimozFrame.java:77)
at javax.swing.JList.fireSelectionValueChanged(Unknow n Source)
at javax.swing.JList$ListSelectionHandler.valueChange d(Unknown Source)
at javax.swing.DefaultListSelectionModel.fireValueCha nged(Unknown Source)
at javax.swing.DefaultListSelectionModel.fireValueCha nged(Unknown Source)
at javax.swing.DefaultListSelectionModel.fireValueCha nged(Unknown Source)
at javax.swing.DefaultListSelectionModel.changeSelect ion(Unknown Source)
at javax.swing.DefaultListSelectionModel.changeSelect ion(Unknown Source)
at javax.swing.DefaultListSelectionModel.setSelection Interval(Unknown Source)
at javax.swing.JList.setSelectionInterval(Unknown Source)
at javax.swing.plaf.basic.BasicListUI$Handler.adjustF ocusAndSelection(Unknown Source)
at javax.swing.plaf.basic.BasicListUI$Handler.mousePr essed(Unknown Source)
at java.awt.AWTEventMulticaster.mousePressed(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent( Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(U nknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unkno wn Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForHierar chy(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarch y(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.lang.String
at es02.RimozFrame.valueChanged(RimozFrame.java:77)
at javax.swing.JList.fireSelectionValueChanged(Unknow n Source)
at javax.swing.JList$ListSelectionHandler.valueChange d(Unknown Source)
at javax.swing.DefaultListSelectionModel.fireValueCha nged(Unknown Source)
at javax.swing.DefaultListSelectionModel.fireValueCha nged(Unknown Source)
at javax.swing.DefaultListSelectionModel.setValueIsAd justing(Unknown Source)
at javax.swing.JList.setValueIsAdjusting(Unknown Source)
at javax.swing.plaf.basic.BasicListUI$Handler.mouseRe leased(Unknown Source)
at java.awt.AWTEventMulticaster.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent( Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(U nknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unkno wn Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForHierar chy(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarch y(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

:dh:
grazie :ciauz:

valer_85
17-06-2005, 14:52
forse il problema ke il cast non v a buon fine xk getSelectedIndex() ritorna una stringa... :confused:

LeleFT
17-06-2005, 15:09
Scusa il ritardo, ma lavorando non ho moltissimo tempo per guardare il forum (anche se sembro sempre collegato :) ).
Allora... per gestire il tutto su Listener esterni differenti sufficiente che tu tu crei una classe per ciascun listener (e immagino che tu l'abbia gi fatto), e che tu passi al costruttore di questi listener gli oggetti di cui hai bisogno (quindi l'ArrayList e la JList). A questo punto, dentro ai listener li gestisci come se fossero locali al listener stesso.

Da quel che vedo, per, tu vuoi gestire la cosa dal Listener associato al JList, quindi quest'ultimo oggetto lo puoi tranquillamente ricavare dall'evento ListSelectionEvent:


JList lst = (JList) e.getSource();

Per quanto riguarda il ClassCastException dipende da come hai gestito la cosa. Se il ListCellRenderer che hai usato quello di default (non l'hai modificato), allora il metodo getSelectedObject() ti restituisce una stringa... dunque basta modificare il cast:


String app = (String) c1.getSelectedValue();

Se invece hai utilizzato un Renderer diverso, allora potrai gestirtelo a mano, in base alle tue impostazioni.


Ciao. :ciauz:

valer_85
17-06-2005, 15:21
figurati, nn ti preoccupare, mi rispondi appena hai tempo!anzi, ti ringrazio ke 6 molto disponibile! :) alla fine ho deciso di fare senza listener esterni,seno viene troppo incasinato x le mie capacit :D
x quanto riguarda il cast, il ListCellRenderer ( che non so cosa sia ) ho usato quello di default... a me servirebbe ke ritornasse un'oggetto mio( che conterrebbe al suo interno nome, cognome, data...) e non una stringa xk nn saprei come gestirla. a meno ke nn facessi un confronto tra la stringa ottenuta dalla lista e quella ottenuta facendo il toString di ogni campo dell'arraylist, ma mi sembra poco efficace...
boh...tu come faresti?
grazie ancora...
ciao :ciauz:

LeleFT
17-06-2005, 15:36
Se tu alla JList passi degli oggetti di tipo Appello, allora potresti provare a recuperare l'oggetto attraverso il ListModel.
Non l'ho provato, ma credo che si possa fare in questo modo:


int indice = jlist.getSelectedIndex();
Appello app = (Appello) jlist.getModel().getElementAt(indice);

In effetti io, tutte le volte che ho utilizzato le JList, ho avuto a che fare con delle Stringhe, quindi il problema non mi si poneva. Ma la cosa mi sembrava limitativa... credo che il ListModel, a questo punto, giochi il ruolo di "contenitore" dei dati veri e propri (o, per lo meno, offre un'interfaccia per il loro reperimento).


Ciao. :ciauz:

valer_85
17-06-2005, 16:51
:dh: :dh: :dh: non accetta ancora il cast!!!maledizione!

Loading