2009-07-13 18 views
14

Voglio rimuovere alcune righe da una tabella J. Come posso farlo?Come rimuovere una riga da JTable?

+6

Suggerimento: se si spiega quello che hai già provato, e ciò che on-line tutorial che hai letto, le persone saranno più inclini ad aiutarvi. O dare qualche esempio di codice e dirci quale bit non funziona. Leggi questo se non l'hai già fatto: http://java.sun.com/docs/books/tutorial/uiswing/components/table.html –

risposta

3

Un JTable costituisce normalmente la vista parte di un'implementazione MVC. Dovrai rimuovere le righe dal tuo modello. Il JTable, che dovrebbe essere in ascolto per queste modifiche, si aggiornerà per riflettere questa rimozione. Quindi non troverai removeRow() o simile come metodo su JTable.

+0

Grazie per l'aiuto, ma voglio sapere come rimuovere le righe da il modello da tavolo, non sto ottenendo alcun metodo. –

+1

Leggere le cose come: http://java.sun.com/docs/books/tutorial/uiswing/components/table.html – dave

+0

In breve, si crea un ModelloModello personalizzato. JTable non memorizza le righe, la delega a un TableModel. Se lo desideri, puoi creare una sottoclasse da AbstractTableModel. Chiama fireTableRowsDeleted() ogni volta che elimini le righe. – dave

3

sguardo al DefaultTableModel per un modello semplice che è possibile utilizzare:

http://java.sun.com/javase/6/docs/api/javax/swing/table/DefaultTableModel.html

Questo si estende l'AbstractTableModel, ma dovrebbe essere sufficiente ai fini di base. Puoi sempre estendere AbstractTableModel e crearne uno tuo. Assicurati di averlo impostato anche su JTable.

http://java.sun.com/javase/6/docs/api/javax/swing/table/AbstractTableModel.html

sguardo al tutorial di base Sun per ulteriori informazioni sull'uso del JTable con il modello da tavolo:

http://java.sun.com/docs/books/tutorial/uiswing/components/table.html#data

33

Al fine di rimuovere una riga da una JTable, è necessario rimuovere la riga di destinazione dal sottostante TableModel. Se, per esempio, il vostro TableModel è un'istanza di DefaultTableModel, è possibile rimuovere una riga nel modo seguente:

((DefaultTableModel)myJTable.getModel()).removeRow(rowToRemove); 
+0

Grazie per l'aiuto, ma ho usato questo metodo e non funziona. in realtà il mio JTable utilizza il modello di tabella di estensione extest modello LocationTable (creato proprio) così quando sto usando il metodo removeRow (i) dà errore come "non posso risolvere removeRow()" .. quale alternativa dovrei usare .. –

+4

Beh, se tu creato il tuo TableModel personalizzato, quindi sei responsabile della creazione del tuo metodo "removeRow". Guarda il codice sorgente di DefaultTableModel per vedere come è fatto. La soluzione facile è usare DefaultTableModel. Perché pensi che sia necessario creare un modello TableModel personalizzato? Fino a quando non avrai compreso le nozioni di base sull'uso dei modelli, utilizza i valori predefiniti forniti. – camickr

4

Il modo corretto di applicare un filtro a una JTable è attraverso l'RowFilter interfaccia aggiunto a un TableRowSorter. Utilizzando questa interfaccia, è possibile modificare la vista di un modello senza modificare il modello sottostante. Questa strategia preserva il paradigma Model-View-Controller, mentre rimuovere le righe che si desidera nascondere dal modello stesso infrange il paradigma confondendo la separazione delle preoccupazioni.

8

Se avete bisogno di una soluzione di lavoro semplice, provare a utilizzare DefaultTableModel.

Se è stato creato il proprio modello di tabella, che estende AbstractTableModel, è necessario implementare anche il metodo removeRow(). L'implementazione esatta dipende dalla struttura sottostante, che hai usato per memorizzare i dati.

Per esempio, se avete usato vettore, allora potrebbe essere qualcosa di simile:

public class SimpleTableModel extends AbstractTableModel { 
    private Vector<String> columnNames = new Vector<String>(); 
    // Each value in the vector is a row; String[] - row data; 
    private Vector<String[]> data = new Vector<String[]>(); 

    ... 

    public String getValueAt(int row, int col) { 
     return data.get(row)[col]; 
    } 

    ... 

    public void removeRow(int row) { 
     data.removeElementAt(row); 
    } 
} 

Se avete utilizzato List, allora sarebbe molto simili:

// Each item in the list is a row; String[] - row data; 
List<String[]> arr = new ArrayList<String[]>(); 

public void removeRow(int row) { 
    data.remove(row); 
} 

HashMap :

//Integer - row number; String[] - row data; 
HashMap<Integer, String[]> data = new HashMap<Integer, String[]>(); 

public void removeRow(Integer row) { 
    data.remove(row); 
} 

E se si sta utilizzando gli array come questo

String[][] data = { { "a", "b" }, { "c", "d" } }; 

quindi sei fuori di fortuna, perché non c'è modo di rimuovere dinamicamente gli elementi dagli array. Si può provare a utilizzare gli array memorizzando separatamente alcuni flag che notificano quali righe vengono eliminate e quali no, o con qualche altro modo subdolo, ma vorrei sconsigliarlo ... Ciò introdurrebbe una complessità non necessaria, e in effetti sarebbe solo risolvere un problema creando un altro. Questo è un modo infallibile per finire su here. Prova uno dei metodi sopra riportati per memorizzare i dati della tua tabella.

Per una migliore comprensione di come funziona, e cosa fare per rendere il proprio modello di lavoro correttamente, ho fortemente consiglio di fare riferimento a Java Tutorial, DefaultTableModel API ed è source code.

3

mmm è molto semplice ragazzi

for(int i = model.getRowCount() - 1; i >= 0; i--) 
{ 
    model.removeRow(i); 
} 
+1

Niente come milioni di notifiche al mattino ;-) – greenoldman

Problemi correlati