2009-07-13 11 views
14

Ich möchte einige Zeilen von einer JTable entfernen. Wie kann ich es tun?Wie entferne ich eine Zeile von JTable?

+6

Tipp: Wenn Sie erklären, was Sie bereits versucht haben, und was Online-Tutorials Sie gelesen haben, werden die Menschen eher geneigt, Ihnen zu helfen. Oder geben Sie einen Beispielcode und sagen Sie uns, welches Bit nicht funktioniert. Lesen Sie dies, wenn Sie noch nicht: http://java.sun.com/docs/books/tutorial/uiswing/components/table.html –

Antwort

3

Eine JTable bildet normalerweise den View-Teil einer MVC-Implementierung. Sie möchten Zeilen aus Ihrem Modell entfernen. Die JTable, die auf diese Änderungen warten soll, wird aktualisiert, um diese Entfernung wiederzugeben. Daher finden Sie removeRow() oder ähnliches nicht als Methode für JTable.

+0

Danke für die Hilfe, aber ich möchte wissen, wie Sie Zeilen aus entfernen das Tabellenmodell, ich bekomme keine Methode. –

+1

Lesen Sie die folgenden Dinge durch: http://java.sun.com/docs/books/tutorial/uiswing/components/table.html – dave

+0

Kurz gesagt, Sie erstellen ein benutzerdefiniertes TableModel. JTable speichert die Zeilen nicht, sondern delegiert diese an ein TableModel. Sie können von AbstractTableModel ableiten, wenn Sie möchten. Rufen Sie FireTableRowsDeleted() jedes Mal auf, wenn Sie Zeilen löschen. – dave

3

Blick auf die DefaultTableModel für ein einfaches Modell, das Sie verwenden können:

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

Dies verlängert die Abstract, sollte aber für grundlegende Zwecke ausreichend sein. Sie können AbstractTableModel jederzeit erweitern und eigene erstellen. Stellen Sie sicher, dass Sie es auch auf der JTable setzen.

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

Blick auf den grundlegenden Sun-Tutorial für weitere Informationen über die JTable mit dem Tisch-Modell:

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

33

Um eine Zeile aus einer JTable zu entfernen, müssen Sie entfernen die Zielzeile aus dem zugrunde liegenden TableModel. Wenn zum Beispiel Ihre Tablemodel eine Instanz von DefaultTableModel ist, können Sie eine Zeile zu entfernen, indem Sie wie folgt vorgehen:

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

Danke für die Hilfe, aber ich habe diese Methode verwendet und es funktioniert nicht. tatsächlich verwendet mein JTable LocationTable-Modell (eigenes erzeugtes) extendind abstraktes Tabellenmodell, also, wenn ich removeRow (i) Methode verwende, gibt es Fehler als "Kann removeRow() nicht auflösen". was Alternative soll ich verwenden. –

+4

Gut, wenn Sie Wenn Sie Ihr eigenes benutzerdefiniertes TableModel erstellt haben, sind Sie für die Erstellung Ihrer eigenen "removeRow" -Methode verantwortlich. Sehen Sie sich den Quellcode von DefaultTableModel an, um zu sehen, wie dies gemacht wird. Die einfache Lösung besteht darin, das DefaultTableModel zu verwenden. Warum müssen Sie ein benutzerdefiniertes TableModel erstellen? Bis Sie die Grundlagen der Verwendung von Modellen verstehen, verwenden Sie die Standardeinstellungen. – camickr

4

Der richtige Weg, um einen Filter zu einem JTable ist durch die RowFilter Schnittstelle zu einer TableRowSorter anzuwenden. Mit dieser Schnittstelle kann die Ansicht eines Modells geändert werden, ohne das zugrunde liegende Modell zu ändern. Diese Strategie bewahrt das Model-View-Controller-Paradigma, während das Entfernen der Zeilen, die Sie vor dem Modell verborgen halten möchten, das Paradigma durcheinander bringt, indem es Ihre Trennung von Bedenken verwirrt.

8

Wenn Sie eine einfache Arbeitslösung benötigen, versuchen Sie es mit DefaultTableModel.

Wenn Sie ein eigenes Tabellenmodell erstellt haben, das das AbstractTableModel erweitert, sollten Sie auch die removeRow() -Methode implementieren. Die genaue Implementierung hängt von der zugrunde liegenden Struktur ab, mit der Sie Daten gespeichert haben.

Zum Beispiel, wenn Sie Vektor verwendet haben, dann kann es so etwas wie dieses:

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); 
    } 
} 

Wenn Sie Liste verwendet haben, dann wäre es sehr ähnlich sein:

// 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); 
} 

Und wenn Sie Arrays wie diese

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

Dann haben Sie kein Glück, denn es gibt keine Möglichkeit, Elemente dynamisch aus Arrays zu entfernen. Sie können versuchen, Arrays zu verwenden, indem Sie einige Flags separat speichern, die darüber informieren, welche Zeilen gelöscht werden und welche nicht, oder auf eine andere hinterhältige Art, aber ich würde davon abraten ... Das würde unnötige Komplexität einführen und wäre einfach Lösen eines Problems durch Erstellen eines anderen. Das ist ein sicherer Weg, um am Ende here zu enden. Versuchen Sie eine der oben genannten Möglichkeiten, um stattdessen Ihre Tabellendaten zu speichern.

Zum besseren Verständnis davon, wie das funktioniert, und was zu tun ist Ihr eigenes Modell Arbeit richtig zu machen, ich stark beraten Sie zu Java Tutorial, DefaultTableModel API zu beziehen und es ist source code.

3

mmm ist sehr einfach Jungs

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

Nichts wie Millionen Benachrichtigungen am Morgen ;-) – greenoldman

Verwandte Themen