2016-11-25 3 views
0

Ich habe ein Problem mit dem Löschen von Zeilen aus JTable. Mein Code auf der Grundlage dieser Frage: How do you remove selected rows from a JTable?Empfangen von vielen Fehlermeldungen beim Versuch, Zeilen aus JTable zu löschen

public static void removeSelectedRows(JTable table){ 
    DefaultTableModel model = (DefaultTableModel) table.getModel(); 
    int[] rows = table.getSelectedRows(); 
    for (int i = rows.length - 1; i >= 0; i--) { 
     model.removeRow(rows[i]); 
    } 
} 

Wenn ich drücken Sie die Taste ausgewählten Zeilen löschen:

JButton button = new JButton("Delete selected"); 
button.addActionListener(new ActionListener(){ 
    public void actionPerformed(ActionEvent e) { 
     removeSelectedRows(table); 
    } 
}); 

ich viele Fehlermeldungen in meinem Terminal empfangen:

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: javax.swing.JTable$1 cannot be cast to javax.swing.table.DefaultTableModel 
at ConfFrame.removeSelectedRows(ConfFrame.java:37) 
at ConfFrame$1.actionPerformed(ConfFrame.java:63) 
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022) 
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348) 
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402) 
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) 
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252) 
at java.awt.Component.processMouseEvent(Component.java:6533) 
at javax.swing.JComponent.processMouseEvent(JComponent.java:3315) 
at java.awt.Component.processEvent(Component.java:6298) 
at java.awt.Container.processEvent(Container.java:2236) 
at java.awt.Component.dispatchEventImpl(Component.java:4889) 
at java.awt.Container.dispatchEventImpl(Container.java:2294) 
at java.awt.Component.dispatchEvent(Component.java:4711) 
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888) 
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4525) 
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466) 
at java.awt.Container.dispatchEventImpl(Container.java:2280) 
at java.awt.Window.dispatchEventImpl(Window.java:2746) 
at java.awt.Component.dispatchEvent(Component.java:4711) 
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758) 
at java.awt.EventQueue.access$500(EventQueue.java:97) 
at java.awt.EventQueue$3.run(EventQueue.java:709) 
at java.awt.EventQueue$3.run(EventQueue.java:703) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76) 
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86) 
at java.awt.EventQueue$4.run(EventQueue.java:731) 
at java.awt.EventQueue$4.run(EventQueue.java:729) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76) 
at java.awt.EventQueue.dispatchEvent(EventQueue.java:728) 
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201) 
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116) 
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93) 
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82) 
+1

Sie gehen davon aus, dass getModel() ein DefaultTableModel zurückgibt, und es nicht, wie die Ausnahme zeigt. Machen Sie diese Annahme nicht, weil sie falsch ist, wie Sie sehen. Wenn Sie möchten, dass die Tabelle ein DefaultTableModel als Modell hat, erstellen Sie eine und rufen Sie setModel() auf. –

+0

Vielen Dank für Ihre Erklärung! – 0573FE491EA798FDCBC849B0E06EDC

+0

Ein anderer Fehler, den Sie machen, der nicht offensichtlich ist, ist vielleicht: 'table.getSelectedRows();' gibt ** view ** Indizes zurück. Sie verwenden diese ** view ** Indizes, um Zeilen aus dem ** Modell ** zu entfernen! Sie sollten diese Ansichtsindizes in Modellindizes konvertieren, indem Sie zunächst 'JTable.convertRowIndexToModel' in Modellindizes konvertieren und diese aus dem Modell entfernen. Sie werden wissen, warum das wichtig ist, wenn Sie mit dem Sortieren von Zeilen in der JTable beginnen. –

Antwort

2

Sie erstellen Ihre Tabelle mit festen Daten, so dass eine innere Klasse als Ihre TableModel verwendet wird.

Stattdessen müssen Sie Ihre JTable mit Code erstellen so etwas wie:

DefaultTableModel model = new DefaultTableModel(...); 
JTable table = new JTable(model); 

Jetzt in Ihrem Code können Sie die Tablemodel erhalten und es zu einem DefaultTableModel gegossen.

Verwandte Themen