Проблема с удалением последней строки JTable - PullRequest
3 голосов
/ 25 ноября 2010

Я впервые спрашиваю здесь, так что простите, если что-то не подходит, и извините, если мой английский не очень хорош.

Короче говоря, в настоящее время я разрабатываю настольное приложение Java с Swing и у меня возникла проблема с использованием таблицы. У меня есть строки с каждой строкой есть кнопка, чтобы удалить строку. Все в порядке (я могу удалить строки без проблем), пока я не попытаюсь удалить последнюю строку. Последняя строка может быть удалена, но, видимо, есть исключение, что-то вроде этого:

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 4 >= 4
    at java.util.Vector.elementAt(Vector.java:427)
    at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:648)
    at javax.swing.JTable.setValueAt(JTable.java:2710)
    at javax.swing.JTable.editingStopped(JTable.java:4712)
    at javax.swing.AbstractCellEditor.fireEditingStopped(AbstractCellEditor.java:125)

Из трассировки стека кажется, что "4" - это мой ранее удаленный индекс последней строки, но я понятия не имею, как с этим справиться. Я уже ищу решение, но я все еще не могу решить его. Обратите внимание, что есть другие строки, когда я удаляю последнюю строку, и после этого я не могу удалить другие строки. То же исключение также возникает, когда я нажимаю кнопку удаления.

О. и я использую removeRow () из DefaultTableModel, чтобы удалить строку. Любая помощь будет оценена. Спасибо.

EDIT Это код, который я использую.

public class ViewDetail extends JInternalFrame implements ActionListener {
    ...
    String column[] = { "Aaa", "Bbb", "Delete This"};

    tableModel = new DefaultTableModel();
    Object row[][] = new Object[size][column.length];

    //fill the data from db
    int r = 0;
    for (int i = 0; i < size; i++) {
    row[r][0] = ...;
    row[r][1] = ...;
    row[r][2] = "Delete";
    r++;
    }

    tableModel.setDataVector(row, column);
    table = new JTable(tableModel);

    tableColumn = table.getColumn("Aaa");
    tableColumn.setPreferredWidth(75);
    tableColumn = table.getColumn("Bbb");
    tableColumn.setPreferredWidth(75);
    tableColumn = table.getColumn("Delete This");
    tableColumn.setPreferredWidth(75);
    tableColumn.setCellRenderer(new ButtonRenderer());
    tableColumn.setCellEditor(new ButtonEditor(new JCheckBox());
     ...
}

public class ButtonRenderer extends JButton implements TableCellRenderer {
    public ButtonRenderer() {
        setOpaque(true);
    }
    public Component getTableCellRendererComponent(JTable table, Object value,
            boolean isSelected, boolean hasFocus, int row, int column) {
        if (isSelected) {
            setForeground(table.getSelectionForeground());
            setBackground(table.getSelectionBackground());
        } else {
            setForeground(table.getForeground());
            setBackground(UIManager.getColor("Button.background"));
        }
        setText((value == null) ? "" : value.toString());
        return this;
    }
}

public class ButtonEditor extends DefaultCellEditor {
    protected JButton button;
    private String label;
    private boolean isPushed;
    private JTable table;
    public ButtonEditor(JCheckBox checkBox) {
    super(checkBox);
    button = new JButton();
    button.setOpaque(true);
    button.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            fireEditingStopped();
            }
        });
    }

    public Component getTableCellEditorComponent(JTable table, Object value,
        boolean isSelected, int row, int column) {
    if (isSelected) {
        button.setForeground(table.getSelectionForeground());
        button.setBackground(table.getSelectionBackground());
    } else {
        button.setForeground(table.getForeground());
        button.setBackground(table.getBackground());
    }
    label = (value == null) ? "" : value.toString();
    button.setText(label);
    isPushed = true;
    this.table = table;
    return button;
    }

    public Object getCellEditorValue() {
    if (isPushed) {
                  DefaultTableModel tableModel = (DefaultTableModel) table.getModel();                            
                  tableModel.removeRow(table.getSelectedRow());                
            }
            isPushed = false;
    return new String(label);
    }

    public boolean stopCellEditing() {
    isPushed = false;
    return super.stopCellEditing();
}

protected void fireEditingStopped() {
        super.fireEditingStopped();
    }
}

Ответы [ 5 ]

4 голосов
/ 25 ноября 2010

Swing пытается установить новое значение в строке, которую вы удаляете! Попробуйте переместить код удаления в Runnable и используйте invokeLater в классе служебной программы swing для его выполнения.

1 голос
/ 25 ноября 2010

Столбец Столбец кнопки показывает, как вы можете визуализировать столбец как кнопку и как добавить действие, которое выполняется при нажатии кнопки.Пример действия просто показывает, как удалить строку.

1 голос
/ 25 ноября 2010

не могли бы вы опубликовать код, в котором вы инициализируете, добавляете элементы и удаляете в своем JTable?

Мое первое предположение, что вы либо делаете классическую ошибку «У меня есть 4 элемента в моей таблице, чтобы удалить последний, который я удаляю (4)», когда ваша таблица переходит от 0 до 3 в индексах

или вы пытаетесь удалить несколько объектов в одном цикле, как

  for(int i = 0; i<lenght; i++){
       if(i%2==0){//every even number
         tab.remove(i);
        }
    }

тогда вы изменяете размер таблицы, элементы смещены, но вы не учитываете это при удалении.

это всего лишь догадки / указатели на то, что может вызвать проблему. пожалуйста, оставьте свой код, если это не решит

0 голосов
/ 25 июля 2014

Вы можете добавить новую переменную и проверить в fireEditingStopped ():

public class ButtonEditor extends DefaultCellEditor {

//create new variable 
private boolean isDeleteRow = false;
/////////////////

protected JButton button;
private String label;
private boolean isPushed;
private JTable table;
public ButtonEditor(JCheckBox checkBox) {
super(checkBox);
button = new JButton();
button.setOpaque(true);
button.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        fireEditingStopped();
        }
    });
}

public Component getTableCellEditorComponent(JTable table, Object value,
    boolean isSelected, int row, int column) {
if (isSelected) {
    button.setForeground(table.getSelectionForeground());
    button.setBackground(table.getSelectionBackground());
} else {
    button.setForeground(table.getForeground());
    button.setBackground(table.getBackground());
}
label = (value == null) ? "" : value.toString();
button.setText(label);
isPushed = true;
this.table = table;

// set false when click to button
isDeleteRow = false; 
/////////////////
return button;
}

public Object getCellEditorValue() {
if (isPushed) {

              // set true when isPushed button
              isDeleteRow = true;   
              /////////////////

        }
        isPushed = false;
return new String(label);
}

public boolean stopCellEditing() {
isPushed = false;
return super.stopCellEditing();
}

protected void fireEditingStopped() {
    super.fireEditingStopped();

     //check if isDeleteRow, remove row
     if(isDeleteRow)
     {
          DefaultTableModel tableModel = (DefaultTableModel) table.getModel();                            
          tableModel.removeRow(table.getSelectedRow());   
     }
     /////////////////
}
}
0 голосов
/ 24 февраля 2011

Здесь вам нужно удалить только 0-ую строку, которую нужно повторить.

private void refreshTable () {int rowCount = model.getRowCount ();// System.out.println (rowCount);

   for(int i=0;i<rowCount;i++ ){
        model.removeRow(0);
        //System.out.println(i);
   }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...