gpt4 book ai didi

java - JTable 删除行给出 ArrayOutofBounds 异常 -1

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:17:26 26 4
gpt4 key购买 nike

我一直在浏览很多关于这个的网站,并尝试了一些不同的东西,但我被难住了。将不胜感激一些帮助。条件正常,检查是否选中了一个复选框(真),但是当我执行 model.removeRow(row) 时,它会给我这个错误。

public class ExpenditurePanel extends JPanel implements TableModelListener{

private static final long serialVersionUID = 1L;
private static TableModel1 model;
private JTable table;

public ExpenditurePanel() {
model = new TableModel1();
table = new JTable(model);
table.setBorder(new BevelBorder(BevelBorder.LOWERED, null, null, null, null));
table.setRowSelectionAllowed(false);
table.setFillsViewportHeight(true);
table.setCellSelectionEnabled(true);
table.setColumnSelectionAllowed(false);

model.addColumn("Name");
model.addColumn("Week");
model.addColumn("Fortnight");
model.addColumn("Month");
model.addColumn("Year");
model.addColumn("Remove");

Object[] default1 = {"Accomodation","","","","",false};
Object[] default2 = {"Food","","","","",false};

model.addRow(default1);
model.addRow(default2);

model.addTableModelListener(this);

this.add(new JScrollPane(table));
table.setRowSorter(null);

}

public static TableModel1 getModel(){
return model;
}

@Override
public void tableChanged(TableModelEvent e) {
int row = e.getFirstRow();
int column = e.getColumn();
model = (TableModel1) e.getSource();
String columnName = model.getColumnName(column);
Object data = model.getValueAt(row, column);

if(model.getValueAt(row,column) == Boolean.TRUE){
System.out.println("Condition working");

//this part keeps giving me error.
model.removeRow(row);
}
}
}

这是它抛出的内容:

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1
at java.util.Vector.elementData(Unknown Source)
at java.util.Vector.elementAt(Unknown Source)
at javax.swing.table.DefaultTableModel.getValueAt(Unknown Source)
at studentBudget.ExpenditurePanel.tableChanged(ExpenditurePanel.java:53)
at javax.swing.table.AbstractTableModel.fireTableChanged(Unknown Source)
at javax.swing.table.AbstractTableModel.fireTableRowsDeleted(Unknown Source)
at javax.swing.table.DefaultTableModel.removeRow(Unknown Source)
at studentBudget.ExpenditurePanel.tableChanged(ExpenditurePanel.java:59)
at javax.swing.table.AbstractTableModel.fireTableChanged(Unknown Source)
at javax.swing.table.AbstractTableModel.fireTableCellUpdated(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.stopCellEditing(Unknown Source)
at javax.swing.DefaultCellEditor$EditorDelegate.actionPerformed(Unknown Source)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.JToggleButton$ToggleButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at javax.swing.plaf.basic.BasicTableUI$Handler.repostEvent(Unknown Source)
at javax.swing.plaf.basic.BasicTableUI$Handler.mouseReleased(Unknown Source)
at java.awt.AWTEventMulticaster.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$000(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

最佳答案

您正在更改 TableModelListener 内部的 TableModel,这对我来说似乎有点冒险,并且存在不必要的递归风险。如果可能的话,我会重构你的代码,以免这样做。如果你仍然卡住了,那么你应该创建并发布一个 sscce .


编辑 1

如果我做一个 sscce从您的代码中添加 println 语句:

import javax.swing.*;
import javax.swing.border.BevelBorder;
import javax.swing.event.*;
import javax.swing.table.*;

public class ExpenditurePanel extends JPanel implements TableModelListener {

private static final long serialVersionUID = 1L;
private static TableModel1 model;
private JTable table;

public ExpenditurePanel() {
model = new TableModel1();
table = new JTable(model);
table.setBorder(new BevelBorder(BevelBorder.LOWERED, null, null, null,
null));
table.setRowSelectionAllowed(false);
table.setFillsViewportHeight(true);
table.setCellSelectionEnabled(true);
table.setColumnSelectionAllowed(false);

model.addColumn("Name");
model.addColumn("Week");
model.addColumn("Fortnight");
model.addColumn("Month");
model.addColumn("Year");
model.addColumn("Remove");

Object[] default1 = { "Accomodation", "", "", "", "", false };
Object[] default2 = { "Food", "", "", "", "", false };

model.addRow(default1);
model.addRow(default2);

model.addTableModelListener(this);

this.add(new JScrollPane(table));
table.setRowSorter(null);

}

public static TableModel1 getModel() {
return model;
}

@Override
public void tableChanged(TableModelEvent e) {
int row = e.getFirstRow();
int column = e.getColumn();

// **** printf added below
System.out.printf("[row: %d, column: %d]%n", row, column);

model = (TableModel1) e.getSource();

String columnName = model.getColumnName(column);

// **** println added below
System.out.println("columnName: " + columnName);

Object data = model.getValueAt(row, column);

if (model.getValueAt(row, column) == Boolean.TRUE) {
System.out.println("Condition working");

// *** AIOOBE called here
model.removeRow(row);
}
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
ExpenditurePanel panel = new ExpenditurePanel();
JFrame frame = new JFrame("foo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(panel);
frame.setLocationRelativeTo(null);
frame.pack();
frame.setVisible(true);
}
});
}
}

// **** no idea how close this is to your code *****
class TableModel1 extends DefaultTableModel {
@Override
public Class<?> getColumnClass(int columnIndex) {
if (getRowCount() == 0) {
return super.getColumnClass(columnIndex);
}
Object value = getValueAt(0, columnIndex);
if (value == null) {
return super.getColumnClass(columnIndex);
}

return value.getClass();
}
}

我得到这个输出:

[row: 0, column: 5]
columnName: Remove
Condition working
[row: 0, column: -1]
columnName:
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1
at java.util.Vector.elementAt(Unknown Source)
...... etc ......

所以您看到模型监听器的 tableChanged(...) 方法被调用两次,这是由于将监听器更改为监听器内部的对象,第二次调用它时,它有一列 -1,这会导致抛出 AIOOBE。


编辑2
一个潜在的解决方案是在对模型进行更改之前删除监听器,然后在进行更改后重新添加监听器:

public void tableChanged(TableModelEvent e) {
int row = e.getFirstRow();
int column = e.getColumn();
System.out.printf("[row: %d, column: %d]%n", row, column);
model = (TableModel1) e.getSource();
String columnName = model.getColumnName(column);
System.out.println("columnName: " + columnName);
Object data = model.getValueAt(row, column);

if (model.getValueAt(row, column) == Boolean.TRUE) {
System.out.println("Condition working");

model.removeTableModelListener(this);
model.removeRow(row);
model.addTableModelListener(this);
}
}

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com