簡體   English   中英

JTable異常刪除行

[英]JTable exception remove row

當我從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組件有關,因為當我刪除then並將其與字符串一起使用時,只有一切正常。 但是我真的不知道如何解決該問題。

問題似乎在於已刪除行的單元格當前處於編輯模式,並且已刪除單元格觸發了“停止編輯”事件。 嘗試使用以下命令在刪除部分之前停止單元格版本:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM