2012-03-25 99 views
6

Tengo una JList que usa un DefaultListModel.Java - Actualización de JList después de cambiar un objeto

Luego agrego valores al modelo que luego aparecen en la Lista J. He creado un MouseListener que (cuando se hace doble clic) permite al usuario editar el número de usuario actual de esa persona que ha seleccionado.

He comprobado que el objeto real de ese registro está siendo cambiado, y lo es. El único problema que tengo es conseguir que la lista J actual se actualice para mostrar los nuevos valores de ese objeto.

Fragmentos del código actual que tengo son:

Creación de la JList y DefaultTableModel:

m = new DefaultListModel(); 
m.addListDataListener(this); 
jl = new JList(m); 
jl.addMouseListener(this); 

Actualización del objeto:

String sEditedNumber = JOptionPane.showInputDialog(this, "Edit number for " + name, number); 
if (sEditedNumber != null) { 
    directory.update (name, sEditedNumber); 
} 

Y (cuando jl es el JList y m es el DefaultTableModel):

public void contentsChanged(ListDataEvent arg0) { 
     jl.setModel(m); 
    } 
+1

¿Por qué está utilizando 'MouseListener' en lugar de [' ListSelectionListener'] (http://docs.oracle.com/javase/tutorial/uiswing/events/listselectionlistener.html)? – trashgod

Respuesta

3

es necesario llamar a fireContentsChanged() en el ListModel.

+0

¿Puedo hacer esto en DefaultListModel? – mino

+0

@ M92: ¿Por qué no desde DefaultListModel se extiende desde AbstractListModel? –

+0

No estoy seguro de cómo implementar esto, sin embargo, ¿podría obtener alguna orientación? Parece que no puedo hacer que funcione. ¿Dónde lo agrego y cómo lo uso para actualizar JList? Intento usar el enlace proporcionado pero no llegar muy lejos. – mino

11

En lugar de setModel(), actualizar su modelo existente utilizando uno de los métodos DefaultListModel como setElementAt(), que se fireContentsChanged() para usted.

+0

Ver también [* Cómo usar listas *] (http://docs.oracle.com/javase/tutorial/uiswing/components/list.html). – trashgod

0

Debe llamar al DefaultListModel.fireContentsChanged(). Pero como este método está protegido (realmente me pregunto por qué), no puedes hacer eso directamente. En su lugar, hacer una pequeña subclase:

class MinoListModel<T> extends DefaultListModel<T> 
{ 
    public void update(int index) 
    { 
     fireContentsChanged(this, index, index); 
    } 
} 

utilizarlo como su lista de modelos:

m = new MinoListModel<>(); 
jl = new JList(m); 

Después de actualizar un número de usuario, actualizar la entrada correspondiente: m.update(theIndex);

Alternativamente, si no' Si desea una subclase, simplemente puede reemplazar el elemento JList después de que el número de usuario haya cambiado: m.setElementAt(theSameElement, theIndex);. Aunque esto es algo engorroso, tener una subclase parece ser el enfoque más limpio.

Cuestiones relacionadas