从JTable中删除1个选定的行

时间:2013-06-22 19:36:34

标签: java swing jtable defaulttablemodel

我尝试了将近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&gt; = 2

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

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

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

});

这段代码搞乱了删除命令。

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

2 个答案:

答案 0 :(得分:2)

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);
    }

答案 1 :(得分: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