Java JTable insertRow ArrayIndexOutOfBoundsException
我试图在单击按钮后向表中插入一行,但收到下面的堆栈异常Java JTable insertRow ArrayIndexOutOfBoundsException,java,swing,jtable,indexoutofboundsexception,Java,Swing,Jtable,Indexoutofboundsexception,我试图在单击按钮后向表中插入一行,但收到下面的堆栈异常 Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 0 >= 0 at java.util.Vector.elementAt(Unknown Source) at javax.swing.table.DefaultTableModel.justifyRows(Unknown Source) at jav
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 0 >= 0
at java.util.Vector.elementAt(Unknown Source)
at javax.swing.table.DefaultTableModel.justifyRows(Unknown Source)
at javax.swing.table.DefaultTableModel.insertRow(Unknown Source)
at com.testingarea.TestModel$2.actionPerformed(TestModel.java:64)
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.DefaultButtonModel.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 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$200(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)
我已经创建了下面的SSCCE,因此您可以重新创建。我不完全确定为什么会发生这种情况,我想这可能与我的模型有关
package com.testingarea;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Vector;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.WindowConstants;
import javax.swing.table.DefaultTableModel;
public class TestModel {
private DespatchTypeParameterTableModel _model = new DespatchTypeParameterTableModel();
private JTable _table = new JTable(_model);
public static void main(String... args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
createAndShowGUI();
}
});
}
public static void createAndShowGUI() {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.getContentPane().add(new TestModel().makeUI());
frame.setSize(800, 600);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
private Component makeUI() {
JPanel p = new JPanel(new BorderLayout());
p.add(new JScrollPane(_table), BorderLayout.NORTH);
p.add(createButtonPanel(), BorderLayout.SOUTH);
return p;
}
private Component createButtonPanel() {
JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT, 5, 5));
JButton insertButton = new JButton("Insert Despatch Type Parameter");
insertButton.addActionListener(new ActionListener() {
@SuppressWarnings("rawtypes")
@Override
public void actionPerformed(ActionEvent event) {
int lastSelectedRow = _table.getSelectionModel().getMaxSelectionIndex();
int realRow = lastSelectedRow;
Vector vector = new Vector();
_table.clearSelection();
if (lastSelectedRow == -1) {
((DefaultTableModel)_model).insertRow(_table.getRowCount(), vector);
_model.addDespatchTypeParameter(new DespatchTypeParameter("Test Name", "Test Description", "Test Value"));
_table.getSelectionModel().setSelectionInterval(_table.getRowCount() - 1,
_table.getRowCount() - 1);
} else {
((DefaultTableModel)_model).insertRow(realRow + 1, vector);
_model.addDespatchTypeParameter(new DespatchTypeParameter("Test Name", "Test Description", "Test Value"));
_table.getSelectionModel().setSelectionInterval(realRow + 1, realRow + 1);
}
}
});
buttonPanel.add(insertButton);
return buttonPanel;
}
@SuppressWarnings("serial")
private static final class DespatchTypeParameterTableModel extends DefaultTableModel {
private Vector<DespatchTypeParameter> _dtParameterList;
public DespatchTypeParameterTableModel() {
setColumnIdentifiers(new String[]{"Parameter Name", "Parameter Description", "Parameter Value"});
_dtParameterList = new Vector<DespatchTypeParameter>();
}
@Override
public int getRowCount() {
return _dtParameterList == null ? 0 : _dtParameterList.size();
}
@Override
public boolean isCellEditable(int row, int column) {
return false;
}
@Override
public Object getValueAt(int row, int column) {
Object value = null;
DespatchTypeParameter dtParameter = getDespatchTypeParameter(row);
if (getColumnName(column).equals("Parameter Name")){
value = dtParameter.getParameterName();
}else if (getColumnName(column).equals("Parameter Description")){
value = dtParameter.getParameterDescription();
}else if (getColumnName(column).equals("Parameter Value")){
value = dtParameter.getParameterValue();
}
return value;
}
public DespatchTypeParameter getDespatchTypeParameter(int row){
if (row < 0 || row >= _dtParameterList.size()){
return null;
}
return (DespatchTypeParameter)_dtParameterList.get(row);
}
public void addDespatchTypeParameter(DespatchTypeParameter despatchTypeParameter) {
if (despatchTypeParameter != null){
_dtParameterList.add(despatchTypeParameter);
fireTableRowsInserted(_dtParameterList.size() - 1, _dtParameterList.size() - 1);
}
}
@Override
public void removeRow(int row) {
if (row >= 0 && row < _dtParameterList.size()){
_dtParameterList.remove(row);
fireTableRowsDeleted(row, row);
}
}
@Override
public Vector<DespatchTypeParameter> getDataVector() {
return _dtParameterList;
}
}
private static class DespatchTypeParameter {
private String _parameterName;
private String _parameterDescription;
private String _parameterValue;
public DespatchTypeParameter(String parameterName, String parameterDescription, String parameterValue) {
_parameterName = parameterName;
_parameterDescription = parameterDescription;
_parameterValue = parameterValue;
}
public String getParameterName() {
return _parameterName;
}
public String getParameterDescription() {
return _parameterDescription;
}
public String getParameterValue() {
return _parameterValue;
}
}
}
package com.testingarea;
导入java.awt.BorderLayout;
导入java.awt.Component;
导入java.awt.EventQueue;
导入java.awt.FlowLayout;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.util.Vector;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.JScrollPane;
导入javax.swing.JTable;
导入javax.swing.WindowConstants;
导入javax.swing.table.DefaultTableModel;
公共类测试模型{
私有DispatchTypeParameterTableModel _model=新DispatchTypeParameterTableModel();
私有JTable _table=新JTable(_模型);
公共静态void main(字符串…参数){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
createAndShowGUI();
}
});
}
公共静态void createAndShowGUI(){
JFrame=新JFrame();
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.getContentPane().add(新的TestModel().makeUI());
框架设置尺寸(800600);
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
私有组件makeUI(){
JPanel p=newjpanel(newborderlayout());
p、 添加(新的JScrollPane(_表),BorderLayout.NORTH);
p、 添加(createButtonPanel(),BorderLayout.SOUTH);
返回p;
}
私有组件createButtonPanel(){
JPanel buttonPanel=新的JPanel(新的FlowLayout(FlowLayout.RIGHT,5,5));
JButton insertButton=新JButton(“插入发送类型参数”);
insertButton.addActionListener(新ActionListener(){
@抑制警告(“原始类型”)
@凌驾
已执行的公共无效操作(操作事件){
int lastSelectedRow=_table.getSelectionModel().getMaxSelectionIndex();
int realRow=lastSelectedRow;
向量=新向量();
_表1.1选举();
如果(lastSelectedRow==-1){
((DefaultTableModel)_model).insertRow(_table.getRowCount(),vector);
_model.addDispatchTypeParameter(新的DispatchTypeParameter(“测试名称”、“测试描述”、“测试值”));
_table.getSelectionModel().setSelectionInterval(_table.getRowCount()-1,
_table.getRowCount()-1);
}否则{
((DefaultTableModel)model).insertRow(realRow+1,vector);
_model.addDispatchTypeParameter(新的DispatchTypeParameter(“测试名称”、“测试描述”、“测试值”));
_table.getSelectionModel().setSelectionInterval(realRow+1,realRow+1);
}
}
});
buttonPanel.add(插入按钮);
返回按钮面板;
}
@抑制警告(“串行”)
私有静态最终类DispatchTypeParameterTableModel扩展了DefaultTableModel{
私有向量参数表;
public DispatchTypeParameterTableModel(){
setColumnIdentifiers(新字符串[]{“参数名称”、“参数说明”、“参数值”});
_dtParameterList=新向量();
}
@凌驾
public int getRowCount(){
return _dtParameterList==null?0:_dtParameterList.size();
}
@凌驾
公共布尔值可编辑(int行,int列){
返回false;
}
@凌驾
公共对象getValueAt(int行,int列){
对象值=空;
DispatchTypeParameter dtParameter=GetDispatchTypeParameter(行);
if(getColumnName(column).equals(“参数名”)){
value=dtParameter.getParameterName();
}else if(getColumnName(column).equals(“参数说明”)){
value=dtParameter.getParameterDescription();
}else if(getColumnName(column).equals(“参数值”)){
value=dtParameter.getParameterValue();
}
返回值;
}
公共DispatchTypeParameter GetDispatchTypeParameter(int行){
如果(行<0 | |行>=\u dtParameterList.size()){
返回null;
}
return(DispatchTypeParameter)\u dtParameterList.get(行);
}
public void addDispatchTypeParameter(DispatchTypeParameter DispatchTypeParameter){
if(DispatchTypeParameter!=null){
_dtParameterList.add(DispatchTypeParameter);
fireTableRowsInserted(_-dtParameterList.size()-1,_-dtParameterList.size()-1);
}
}
@凌驾
公共无效清除器OW(int行){
if(行>=0&&row<\u dtParameterList.size()){
_dtParameterList.remove(行);
fireTableRowsDeleted(行,行);
}
}
@凌驾
公共向量getDataVector(){
返回参数列表;
}
}
私有静态类DispatchTypeParameter{
私有字符串\u参数名称;
私有字符串_参数描述;
私有字符串_参数值;
public DispatchTypeParameter(字符串参数名称、字符串参数说明、字符串参数值){
_parameterName=parameterName;
_parameterDescription=parameterDescription;
_parameterValue=parameterValue;
}
公共字符串getParameterName(){
返回参数名;
}
公共字符串getParameterDescription(){
返回参数描述;
}
公共字符串getParameterValue(){
返回_参数值;
}
}
}
我似乎已经通过删除
@Override
public int getRowCount() {
return _dtParameterList == null ? 0 : _dtParameterList.size();
}
DefaultTableModel不需要对fireTableRowsXxx进行重复调用,请检查您是否在没有覆盖DefaultTableModel的情况下尝试了此代码(我认为这是错误的),然后必须工作,使用addRow而不是insertRow(取决于或来自if-else的结果)@mKorbel addRow给我一个类似的越界异常。我做了覆盖,因为我有一些定制的行为,我想用getValueAt等来覆盖。