java - JTable异常删除行

标签 java swing jtable

当我从 Swing JTable 中删除一行然后单击 JTable 时,出现异常:

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 2 >= 2
at java.util.Vector.elementAt(Unknown Source)
at javax.swing.table.DefaultTableModel.setValueAt(Unknown Source)
at javax.swing.JTable.setValueAt(Unknown Source)
at javax.swing.JTable.editingStopped(Unknown Source)
at javax.swing.AbstractCellEditor.fireEditingStopped(Unknown Source)
at javax.swing.DefaultCellEditor$EditorDelegate.stopCellEditing(Unknown Source)
at javax.swing.DefaultCellEditor$3.stopCellEditing(Unknown Source)
at javax.swing.DefaultCellEditor.stopCellEditing(Unknown Source)
at javax.swing.plaf.basic.BasicTableUI$Handler.mousePressed(Unknown Source)
at java.awt.AWTEventMulticaster.mousePressed(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)

这是我的代码:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.DefaultCellEditor;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn; 

public class TableSelection extends JPanel {

private static JTable tableau = new JTable();
TableColumn sportColumn, sportColumn2;
private JComboBox<String> checkboxs = new JComboBox<String>();
private JComboBox<String> checkboxs2 = new JComboBox<String>();
JScrollPane jsp1, jsp2;
String labels[];

public TableSelection() { 
    labels = new String[11];

    for (int i = 1; i < 10 + 1; i++) {
        labels[i] = ""+(i - 1);
    }

    ((DefaultTableModel) tableau.getModel()).addColumn("Base source");
    ((DefaultTableModel) tableau.getModel()).addColumn("Base destination");

    sportColumn = tableau.getColumnModel().getColumn(0);

    sportColumn2 = tableau.getColumnModel().getColumn(1);

    checkboxs.setModel(new DefaultComboBoxModel(labels));
    checkboxs.setBackground(Color.WHITE);
    checkboxs.setSelectedIndex(0);
    sportColumn.setCellEditor(new DefaultCellEditor(checkboxs));

    checkboxs2.setModel(new DefaultComboBoxModel(labels));
    checkboxs2.setBackground(Color.WHITE);
    checkboxs2.setSelectedIndex(0);
    sportColumn2.setCellEditor(new DefaultCellEditor(checkboxs2));

    ((DefaultTableModel) tableau.getModel()).addRow(new String[] {         labels[0], labels[0] });
    ((DefaultTableModel) tableau.getModel()).addRow(new String[] { labels[0], labels[0] });
    ((DefaultTableModel) tableau.getModel()).addRow(new String[] { labels[0], labels[0] });

    tableau.setPreferredScrollableViewportSize(new Dimension(200, 200));
    tableau.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    this.add(new JScrollPane(tableau));
    tableau.setRowSelectionInterval(0, 0);

}

public static void main(String[] args) {
    JFrame f = new JFrame("TableSelection");
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.add(new TableSelection());

    JButton removeButton = new JButton("remove");
    removeButton.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) { 
            int selected = tableau.getSelectedRow();
            if (tableau.getSelectedRowCount() > 0) {

                ((DefaultTableModel) tableau.getModel()).removeRow(selected);

                if (selected > 1)
                    tableau.setRowSelectionInterval(Math.max(0, (selected - 1)), (Math.max(0, (selected - 1))));

            }
        }

    });

    f.add(removeButton, BorderLayout.SOUTH);
    f.pack();
    f.setLocationRelativeTo(null);
    f.setVisible(true);
}
}

我已经检查了删除操作之前和之后的行数,一切似乎都是正确的。我认为有一些与 JComboBox 组件相关的东西,因为当我删除然后并使用带有字符串的单元格时,一切都正常。但我真的不知道如何解决这个问题。

最佳答案

问题似乎是已删除行的单元格当前处于编辑模式,并且为已删除的单元格触发“停止编辑”事件。尝试在删除部分之前停止单元格版本,使用:

DefaultCellEditor dce = (DefaultCellEditor)tableau.getCellEditor(); 
if (dce != null) dce.stopCellEditing();

关于java - JTable异常删除行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34157768/

相关文章:

java - JTable valuechanged 然后更改单元格颜色

java - 两个 JFrames 同时运行

java - 如何使 JFrame(带计时器)从另一个类打开另一个 JFrame

java - 当 hashcode() 返回零时,对 Collection 实现有何影响

java - 使用类别将数据保存在 SQLite 中

java - Java中从多个类绘制到主类

java - 如何为 JTable 列标题添加渐变背景?

java - 更改 JTable 列的宽度

java - 使用 JPA 和 Spring 加载选定的 Hibernate 实体

java - 如何在 Nitrous.IO 中预览/运行 Java 程序?