이것은 처음으로 여기에서 묻습니다. 뭔가 적절하지 않으면 용서해주세요. 내 영어가 좋지 않으면 미안 해요.JTable의 마지막 행을 지우는 데 문제가 있습니다.
글자를 짧게하기 위해 현재 스윙으로 자바 데스크톱 앱을 개발 중이며 테이블을 사용하는 데 문제가 있습니다. 각 행에 행을 삭제하는 단추가있는 행이 있습니다. 마지막 행을 삭제하려고 시도 할 때까지 모든 것이 괜찮습니다 (아무 문제없이 행을 삭제할 수 있음). 마지막 행이 삭제 될 수 있습니다하지만 분명히 예외가, 이런 일이 :
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",하지만 난 방법을 모르고 내 이전에 삭제 된 마지막 행 인덱스가없는 것 같다 이것을 처리하십시오. 이미 솔루션을 찾고 있지만 여전히 해결할 수는 없습니다. 마지막 행을 삭제할 때 다른 행이 있고 그 후에 다른 행을 삭제할 수 없습니다. 삭제 버튼을 클릭 할 때도 동일한 예외가 발생합니다.
오. DefaultTableModel의 removeRow()를 사용하여 행을 삭제합니다. 어떤 도움을 주시면 감사하겠습니다. 감사.
편집 다음 코드는 내가 사용하는 코드입니다.
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();
}
}
당신은 당신의 코드를 게시 할 수 조각? –