Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JTable insertRow ArrayIndexOutOfBoundsException_Java_Swing_Jtable_Indexoutofboundsexception - Fatal编程技术网

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等来覆盖。