-3

我尝试了将近 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 个带有复选框的布尔列:(

4

2 回答 2

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

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

因此,在您删除之前,请检查是否选择了一行。

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

PS:尽量遵循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);
    }
于 2013-06-22T20:07:55.360 回答
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

于 2013-06-22T23:31:28.083 回答