【问题标题】:Remove 1 selected Row from JTable [closed]从 JTable 中删除 1 个选定行 [关闭]
【发布时间】:2013-06-22 19:36:33
【问题描述】:

我尝试了将近 2 个小时来弄清楚如何从 JTable 中删除和更新 1 行,但不知何故它不起作用。 我使用以下代码:

DefaultTableModel modelTable = (DefaultTableModel) jTabelRooster.getModel();

modelTable.addRow(new Object[]{lid.getLidnummer().toString(), lid.getLidvoornaam(), lid.getLidtussenvoegsel(),lid.getLidachternaam(), lid.getAanwezig()});

好的,到目前为止一切都很好..很好地添加了行..但现在我想删除它们:

int SelectedRow = jTabelRooster.getSelectedRow();
modelTable.removeRow(SelectedRow);

当我这样做时,我收到以下错误: 线程“AWT-EventQueue-0”中的异常 java.lang.ArrayIndexOutOfBoundsException: 2 >= 2

您的帮助将不胜感激

编辑: jTabelRooster 已被 gui 布局管理器插入 所以我现在有了这段代码,但我没有获得太多成功:

private void initRoosterDetail()
{
   for(int i = 0; i < leden.size(); i++)
        {
            lid = leden.get(i);

            modelTable.addRow(new Object[]{lid.getLidnummer().toString(), lid.getLidvoornaam(), lid.getLidtussenvoegsel(),lid.getLidachternaam(), lid.getAanwezig()});

        }
}
private void jbInschrijvingVerwijderenActionPerformed(java.awt.event.ActionEvent evt) {                                                          
        int SelectedRow = jTabelRooster.getSelectedRow();
        modelTable.removeRow(jTabelRooster.convertRowIndexToModel(SelectedRow));
  }  

一定是这个:)

当我在表格中选择 1 行并按下取消按钮时.. 我收到此消息:

线程“AWT-EventQueue-0”中的异常 java.lang.ArrayIndexOutOfBoundsException: 2 >= 2

============================================== ==================================================== ==================================================== ==================================================== ==================================================== ==================================================== ===================================

感谢大家的帮助...我知道我做错了什么...这与我使用的 tableModelListener 有关..所以这给我留下了另一个问题:)

 jTabelRooster.getModel().addTableModelListener(
        new TableModelListener()
        {
        public void tableChanged(TableModelEvent evt) 
        {
             if(jTabelRooster.getSelectedColumn() == 4)
             {
              }
    }

});

这段代码弄乱了 deleterow 命令。

我有 1 个带有复选框的布尔列 :(

【问题讨论】:

  • 在此处快速获得体面答案的建议:创建并发布一个非常小的可编译、可运行的示例程序,我们可以不加改动地运行该示例程序来演示您的问题,sscce
  • 正如@HovercraftFullOfEels 所建议的那样发布SSCCE或至少发布您代码的相关方法,这样我们就不必费力地猜测错误的原因......我的快速问题..显示您创建modelTable对象的方法
  • @user2445977:请不要在 cmets 中发布代码,因为它会丢失所有格式并变得不可读。而是使用新代码编辑您的问题。关于sscce,您越早发布它,您就越早得到正确答案。还可以考虑在本网站上回复您的其他问题。我们是志愿者,想知道您花时间阅读我们的贡献以及它是否有帮助。您的回复将有助于激励其他人为您提供更多帮助。
  • 好的..非常感谢您的支持..我现在添加一些额外的代码
  • 请添加异常的堆栈跟踪

标签: java swing jtable defaulttablemodel


【解决方案1】:
int selectedRow = jTabelRooster.getSelectedRow();
modelTable.removeRow(SelectedRow);

如果没有选择行,则jTabelRooster.getSelectedRow() 将返回-1

所以在你删除之前检查一行是否被选中。

int selectedRow = jTabelRooster.getSelectedRow();
if(selectedRow != -1) {
    modelTable.removeRow(selectedRow);
}

P.S: 尽量遵循 java 命名约定。变量名应以小写字母开头。

编辑: 一个展示如何使用DefaultTableModel 从表中添加和删除行的示例。

private void createUI() {
        JFrame frame = new JFrame();

        frame.setLayout(new BorderLayout());

        final JTable table = new JTable();
        final DefaultTableModel model = new DefaultTableModel(5, 3);
        table.setModel(model);

        JPanel btnPnl = new JPanel(new BorderLayout());
        JPanel bottombtnPnl = new JPanel(new FlowLayout(FlowLayout.CENTER));

        JButton addBtn = new JButton("Add");
        JButton deleteBtn = new JButton("Remove");
        bottombtnPnl.add(addBtn);
        bottombtnPnl.add(deleteBtn);

        addBtn.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                model.addRow(new Object[]{});
            }
        });

        deleteBtn.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                int selRow = table.getSelectedRow();
                if(selRow != -1) {
                    model.removeRow(selRow);
                }
            }
        });

        btnPnl.add(bottombtnPnl, BorderLayout.CENTER);

        table.getTableHeader().setReorderingAllowed(false);

        frame.add(table.getTableHeader(), BorderLayout.NORTH);
        frame.add(table, BorderLayout.CENTER);
        frame.add(btnPnl, BorderLayout.SOUTH);

        frame.setTitle("JTable Example.");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }

【讨论】:

  • 这也是一个很好的建议,应该遵循,但不太可能是错误的原因。通过错误消息java.lang.ArrayIndexOutOfBoundsException: 2 &gt;= 2,我们知道getSelectedRow() 正在返回2,但也知道rowCount 已经是2。有些事情是原始海报没有显示给我们。我们已经要求提供更多信息,这些信息将使我们不必猜测答案,但由于未知原因,他仍然对我们隐瞒更多信息。
  • @HovercraftFullOfEels AFAIK 如果表中只有 2 行,我仍然不明白 OP 如何将选定的行设为 2。由于这些行的索引将为 {0, 1}。
  • 我现在确实取得了一些成功.. 我使用 selectedRow - 1 但是.. 我无法以某种方式摆脱第一行 :)
  • @HovercraftFullOfEels,我不确定convertRowIndexToModel 在得到-1 时会返回什么。它说如果索引大于getRowCount(),它会抛出IndexOutOfBoundException,但它可能会为-1返回一些意想不到的值(在这种情况下可能是2......)。
  • @user2445977 请参阅编辑帖子。我添加了一个例子。它展示了如何在表中添加和删除行。
【解决方案2】:

我们可以根据这段代码说:

private void jbInschrijvingVerwijderenActionPerformed(java.awt.event.ActionEvent evt) {                                                          
    int SelectedRow = jTabelRooster.getSelectedRow();
    modelTable.removeRow(jTabelRooster.convertRowIndexToModel(SelectedRow));
}

这个错误:

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 2 >= 2

是不是你的 ModelTable 持有的 TableModel 与 jTabelRooster JTable 持有的实际模型不同步,仅此而已。我们知道这一点,因为您在 JTable 中选择的行是第 2 行,即第 3 行,但是您的模型由 modelTable 持有,显示它只持有 2 行。根据您迄今为止提供的有限信息,我们无法猜测这是如何发生或为什么发生的。

同样,您应该强烈考虑创建和发布sscce

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-28
    • 1970-01-01
    • 2014-06-21
    • 2012-04-25
    • 2016-11-28
    • 1970-01-01
    • 2019-03-08
    • 2014-10-09
    相关资源
    最近更新 更多