Java-JTable-getSelectedRow()中的数据错误

Java-JTable-getSelectedRow()中的数据错误,java,swing,jtable,Java,Swing,Jtable,我到处寻找,所以这是我最后的希望 我有一个JTable,其中填充了一些CSV值。当我执行删除选定行的操作时,它不会删除所有。。。要更好地理解,请执行调试: Begin (total selected): 6 Removed index: 6 Removed index: 4 Removed index: 3 Removed index: 2 Removed index: 1 End (total selected): 0 但剩下的是。。。。请注意,其中5个已删除,但有一个已跳过。。。我不明白为

我到处寻找,所以这是我最后的希望

我有一个JTable,其中填充了一些CSV值。当我执行删除选定行的操作时,它不会删除所有。。。要更好地理解,请执行调试:

Begin (total selected): 6
Removed index: 6
Removed index: 4
Removed index: 3
Removed index: 2
Removed index: 1
End (total selected): 0
但剩下的是。。。。请注意,其中5个已删除,但有一个已跳过。。。我不明白为什么会这样

我的代码:

    // I got a List<LikedHashMap<String, String>> data
    // where I store my CSV data.
    // To populate the JTable I remove from this list (data)
    // and insert to JTable.
    // Before remove from JTable, I put back the row into data.
    // THIS LOOP IS WORKING PRETTY WELL.
    for (int row : this.table.getSelectedRows()) {

        // Vamos recolocar esta linha na lista de não selecionados
        LinkedHashMap<String, String> newRow = new LinkedHashMap<>();

        // Vamos pegar todos os dados da linha
        for (int c = 0; c < this.headerCols.size(); c++) {
            newRow.put(
                this.headerCols.get(c),
                (String) this.tableModel.getValueAt(row, c)
            );
        }

        // Adiciona aos nao selecionados
        if (!this.data.contains(newRow)) {
            this.data.add(newRow);
        }
    }

    /**
     * MY PROBLEM ACTUALLY BEGINS HERE...
     */

    System.out.println("Begin (total selected): "+String.valueOf(this.table.getSelectedRowCount()));

    // Remove da tabela.
    while(this.table.getSelectedRow() != -1) {

        System.out.println("Removed item: "+String.valueOf(this.table.getSelectedRowCount()));

        this.tableModel.removeRow(this.table.getSelectedRow());
    }

    System.out.println("End (total selected): "+String.valueOf(this.table.getSelectedRowCount()));

非常感谢你们,伙计们

您错误地使用视图索引为模型编制索引。代码中的问题:


  • 您的
    for
    内部循环应该如下所示:


  • 您可以从顶部的介绍中了解更多有关视图索引与模型索引的信息。一些相关引用:

    JTable专门使用整数来引用它显示的模型的行和列。JTable只是获取一个表格范围的单元格,并在绘制期间使用getValueAt(int,int)从模型中检索值重要的是要记住,各种JTable方法返回的列索引和行索引是根据JTable(视图)的,不一定与模型使用的索引相同。

    默认情况下,可以在JTable中重新排列列,以便视图的列以与模型中的列不同的顺序显示。这根本不会影响模型的实现:当列被重新排序时,JTable在内部维护列的新顺序,并在查询模型之前转换其列索引

    […]下面显示了如何将坐标从JTable转换为基础模型的坐标:

    int[]selection=table.getSelectedRows();
    for(int i=0;i
    不久前,我回答了一个类似的问题。这种情况处理的是不正确的列索引而不是行索引,但问题是类似的。

    是你的朋友

    所有基于JTables行的方法都是以RowSorter为基础的,它不一定与底层TableModel相同。例如,选择总是以JTable为单位,因此在使用RowSorter时,您需要使用convertRowIndexToView或convertRowIndexToModel进行转换

    根据
    jTable.getSelectedRow()
    返回第一个选定的行索引。对于第一个循环,一切都很好。但一旦删除了该行,其余的行将在删除一行后获得新索引。因此,对于删除一行后剩余的其他行,现在的行索引将不同


    未排序的调试报告是因为在您正在试验的选定行之间有一行未选中。

    谢谢您的回答,这非常有意义!所以我尝试了这个代码但没有成功。。。int行;而((row=this.table.getSelectedRow())!=-1{this.tableModel.removeRow(this.table.convertRowIndexToView(row));}=/table
    是视图,
    tableModel
    是模型。所以在这里你想使用
    convertRowIndexToModel(row)
    。谢谢你,伙计,我得到了它,刚刚做了这个更正,但这根本不是问题所在。。。如果我对这段代码进行注释,关于删除行没有任何更改=/@那你就不明白我给你的代码之后我写的东西了。如果从模型中删除,则需要使用
    convertRowIndexToModel
    将从
    JTable.getSelectedRow
    获取的视图索引转换为模型索引。@MarcoA.Braghim我更新了我的答案,以强调关于视图索引与模型索引的第二个问题。我希望你仔细阅读我给你的额外信息,这样你就不会再犯这样的错误了。PS:this.在每次方法调用之前都有。是不必要的,读得太快会让人厌烦。@MarcoA.Braghim我不是在浪费时间,我很乐意帮助和教育人们。不要从桥上跳下去,这不值得!有时候最好退一步,花点时间放松一下,开始以一种新的精神来看待你的问题。不过,总的来说,如果您不制作自定义JTable控件,而只是使用它来显示数据,那么扩展JTable通常是个坏主意。@MarcoA.Braghim哦,是的,使用线程与UI组件交互是个坏主意。与UI组件的交互需要与UI线程(在Java术语中也称为)同步。Swing对象不是线程安全的,因此从其他线程与它们交互将导致大问题。与其他线程中的Swing组件的交互是使用Well完成的,你说得对,伙计。我使用它:while(this.table.getSelectedRow()!=-1){/…}已经不工作了…=/谢谢你的回答,如果我还没有得到它,很抱歉…给定一个
    DefaultTableModel
    ,使用
    setRowCount(0)
    ,因为@trashgod他只想删除选中的行,而不是所有的行。啊,所有选中的行;知道了!
    Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Invalid index
    at javax.swing.DefaultRowSorter.convertRowIndexToModel(DefaultRowSorter.java:514)
    at javax.swing.JTable.convertRowIndexToModel(JTable.java:2642)
    at javax.swing.JTable.getValueAt(JTable.java:2717)
    at javax.swing.JTable.prepareRenderer(JTable.java:5706)
    at javax.swing.plaf.synth.SynthTableUI.paintCell(SynthTableUI.java:683)
    at javax.swing.plaf.synth.SynthTableUI.paintCells(SynthTableUI.java:580)
    at javax.swing.plaf.synth.SynthTableUI.paint(SynthTableUI.java:364)
    at javax.swing.plaf.synth.SynthTableUI.update(SynthTableUI.java:275)
    at javax.swing.JComponent.paintComponent(JComponent.java:780)
    at javax.swing.JComponent.paint(JComponent.java:1056)
    at javax.swing.JComponent.paintToOffscreen(JComponent.java:5219)
    at javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:290)
    at javax.swing.RepaintManager.paint(RepaintManager.java:1265)
    at javax.swing.JComponent._paintImmediately(JComponent.java:5167)
    at javax.swing.JComponent.paintImmediately(JComponent.java:4978)
    at javax.swing.RepaintManager$4.run(RepaintManager.java:824)
    at javax.swing.RepaintManager$4.run(RepaintManager.java:807)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:807)
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:782)
    at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:731)
    at javax.swing.RepaintManager.access$1300(RepaintManager.java:64)
    at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1720)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756)
    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$1.doIntersectionPrivilege(ProtectionDomain.java:75)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:726)
    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)
    
    int rowModelId = convertRowIndexToModel( row );
    for (int c = 0; c < headerCols.size(); c++) {
        newRow.put(
            headerCols.get(c),
            (String) tableModel.getValueAt(rowModelId, c)
        );
    }
    
    while(table.getSelectedRow() != -1) {
        int rowModelId = convertRowIndexToModel( table.getSelectedRow() );
        System.out.println("Removed item: "+String.valueOf(this.table.getSelectedRowCount()));
        tableModel.removeRow(rowModelId);
    }
    
    int[] selection = table.getSelectedRows();
    for (int i = 0; i < selection.length; i++) {
      selection[i] = table.convertRowIndexToModel(selection[i]);
    }
    // selection is now in terms of the underlying TableModel