2012-05-25 8 views
5

Sono di fronte al problema di righe duplicate nello JXTable. Se ordino i dati JXTable mentre le nuove righe vengono inserite in JXTable, il risultato finale in JXTable mostra righe duplicate che producono risultati non validi nella tabella. Anche mostra anche il conteggio corretto delle righe che sono state inserite, ma alcune righe sono completamente mancanti mentre alcune righe vengono trovate duplicate in JXTable.Come gestire la tabella che ordina e aggiunge dati in parallelo?

Se ordino lo JXTable dopo che tutti i dati sono stati inseriti correttamente, vengono visualizzati i dati corretti, non ci sono righe duplicate e mancano righe.

esempio

codice: Ho un metodo per cui sto passando defaultTableModel e qui si aggiungo voci nella tabella

public void addingItems(DefaultTableModel defaultTableModel) 
{ 
for(int i=0;i< numberofItems;i++){ 
Vector vobject = new Vector(); 
vobject.add("..."); 
vobject.add("xxx"); 
vobject.add("yyy"); 
... 
.. 
vobject.add(""); 
defaultTableModel.addRow(vobject); 
} 

uno dall'altro ho aggiunta di codice di smistamento tableHeader ActionListener

tableheader.addMouseListener(new MouseListener() { 
public void mouseClicked(MouseEvent e) { 
    Vector data = defaultTableModel.getDataVector(); 
    Collections.sort(data, new ColumnSorter(colIndex, ascending)); 
} 

});

Ho inserito il codice nel blocco synchronized ma non riesco a ottenere il successo.

Si prega di fornire una soluzione migliore per gestire questo problema.

+0

Come si aggiungono i dati? – Mark

+0

1) Per un aiuto migliore, pubblicare un [SSCCE] (http://sscce.org/). 2) * "o devo farlo uno per uno?" * Farli in sequenza sembrerebbe avere molto senso. –

+2

Risolverai risposte migliori e più rapide se mostri un [SSCCE] (http://sscce.org). Mr Thompson mi ha battuto su quello ;-) – assylias

risposta

1

Ho inserito il codice nel blocco sincronizzato ma non ho avuto successo.

Perché è necessario gestire la sincronizzazione non solo nel blocco del gestore di ordinamento, ma anche in ogni operazione di modifica.

Ad esempio:

... 
    vobject.add(""); 
    synchronized(monitor) { 
    defaultTableModel.addRow(vobject); 
    } 
} 

e

... 
    Vector data = defaultTableModel.getDataVector(); 
    synchronized(monitor) { 
    Collections.sort(data, new ColumnSorter(colIndex, ascending)); 
    } 
} 

In questo caso l'interfaccia utente potrebbe apparire un po 'che non risponde Se si dispone di un sacco di dati nella tabella in quanto specie è N^2 * log N. Se hai un po 'di circa 200 voci, non ti creerebbe alcun problema.