首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从附加了RowSorter的DefaultTableModel中删除行不会删除最后一行

从附加了RowSorter的DefaultTableModel中删除行不会删除最后一行
EN

Stack Overflow用户
提问于 2009-10-20 22:02:03
回答 2查看 3.1K关注 0票数 0

我对Java比较陌生,尤其是对表更是陌生,而且我在一项特定的任务上遇到了一些麻烦。

我有一个使用扩展DefaultTableModel的定制表模型的JTable,并且我已经将一个TableRowSorter附加到该表。下面的示例应用程序有两个按钮--一个用于将行加载到表中,另一个用于从表中删除所有选定的行。

由于某些原因,如果您选择了表中的最后一行和任何其他行,当您单击“删除”按钮时,它将删除除最后一行之外的所有选定行。您可以删除任何其他行组合,它可以很好地工作。

更重要的是,如果您首先单击列标题对行进行排序(即使行的顺序不变),它也会正常工作。如果我在加载表之后添加一行来显式地对表中的行进行排序,问题就会“消失”,但我想知道为什么我所做的操作是不正确的。

要查看行为,请单击"Load“按钮填充表,选择表中的所有行,然后单击"Remove”按钮。它将删除除最后一行之外的所有行。

正如对println的调用所示,循环中的第一次迭代将选择的行数减少2。无论表中有多少行,此行为都是一致的,但仅当您选择表中的最后一行时才是如此。

我使用的是Java版本的1.6.0_16,你知道我哪里做错了吗?

谢谢,

代码语言:javascript
复制
import javax.swing.*;
import javax.swing.table.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Vector;
import java.util.Arrays;

public class TableTest
extends JFrame
{
  private JTable widgetTable;
  private WidgetTableModel widgetTableModel;

  public static void main(String[] args)
  {
    TableTest frame = new TableTest();
    frame.setSize(600, 400);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
  }

  public TableTest()
  {
    this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

    EventQueue.invokeLater(new Runnable() { public void run() { createUI(); } });
  }

  private void createUI()
  {
    this.setLayout(new BorderLayout());

    JButton loadButton = new JButton("Load");
    loadButton.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        loadPerformed();
      }
    });

    this.add(loadButton, BorderLayout.NORTH);

    widgetTableModel = new WidgetTableModel();
    widgetTable = new JTable(widgetTableModel);
    widgetTable.setRowSorter(new TableRowSorter<WidgetTableModel>(widgetTableModel));
    this.add(new JScrollPane(widgetTable), BorderLayout.CENTER);

    JButton removeButton = new JButton("Remove");
    removeButton.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        removePerformed();
      }
    });

    this.add(removeButton, BorderLayout.SOUTH);
  }

  private void loadPerformed()
  {
    widgetTableModel.addRow(new Object[] {"Widget 1"});
    widgetTableModel.addRow(new Object[] {"Widget 2"});
    widgetTableModel.addRow(new Object[] {"Widget 3"});
    widgetTableModel.addRow(new Object[] {"Widget 4"});
    widgetTableModel.addRow(new Object[] {"Widget 5"});
  }

  private void removePerformed()
  {
    int selectedRow = widgetTable.getSelectedRow();

    while (selectedRow >= 0) {
      System.out.println("selectedRowCount=" + widgetTable.getSelectedRowCount());
      int modelRow = widgetTable.convertRowIndexToModel(selectedRow);
      widgetTableModel.removeRow(modelRow);
      selectedRow = widgetTable.getSelectedRow();
    }
  }
}


class WidgetTableModel
extends DefaultTableModel
{
  public WidgetTableModel()
  {
    this.addColumn("Column 1");
  }
}
EN

回答 2

Stack Overflow用户

发布于 2009-10-20 22:13:13

将"while“改为"if”。选择所有行,然后单击该按钮。由于某种原因,最后一行失去了选择。我也不知道原因。

我发现删除逻辑通常应该从最后一行到0。这样,您就不必担心行被删除时行索引值会发生变化。因此,您需要使用getSelectedRows()方法并以相反的顺序迭代数组。尽管如此,我必须承认我从来没有在排序的表上这样做过,所以我不确定这是否会造成问题。

票数 0
EN

Stack Overflow用户

发布于 2011-12-14 21:59:34

在java.net上也有讨论:http://www.java.net/node/698236

它是核心DefaultRowSorter中的bug #6894632:它的基础(如报告中所解释的)是getModelRowCount()的定义不是很好的语义。已在SwingX DefaultSortController中修复

代码语言:javascript
复制
/** 
 * Additionally, this implementation contains a fix for core 
 * <a href=http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6894632>Issue 6894632</a>.
 * It guarantees to only touch the underlying model during sort/filter and during 
 * processing the notification methods. This implies that the conversion and size query
 * methods are valid at all times outside the internal updates, including the critical 
 * period (in core with undefined behaviour) after the underlying model has changed and 
 * before this sorter has been notified.
 */

不幸的是,在项目迁移之后,SwingLabs论坛中包含完整分析的帖子(was:http://www.java.net/jive/thread.jspa?threadID=77343)不再可用……

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1597576

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档