代码之家  ›  专栏  ›  技术社区  ›  Chris K

java.lang.arrayindexoutofboundsException:0>=0正在尝试填充jtable

  •  9
  • Chris K  · 技术社区  · 15 年前

    我正在对jtable进行子类化,并使用defaultTableModel对我的表数据进行建模。下面的类设置jtable,并向模型添加一行。

    import java.io.File;
    import java.util.Iterator;
    import java.util.Vector;
    
    import javax.swing.JTable;  
    import javax.swing.table.DefaultTableModel;
    import javax.swing.table.TableColumn;
    
    public class SelectedFileTable extends JTable {
    Vector<File> SelectedFiles = new Vector<File>(); 
    DefaultTableModel Model    = new DefaultTableModel();
    
    TableColumn ColumnName     = new TableColumn();
    TableColumn ColumnSize     = new TableColumn();
    TableColumn ColumnRmIcon   = new TableColumn(); 
    
    ImageFilenameFilter Filter = new ImageFilenameFilter();
    
    public SelectedFileTable() {
        super();
        this.setModel(Model);
    
        ColumnName.setHeaderValue(new String("Name") );
          ColumnName.setMinWidth(200);
        ColumnSize.setHeaderValue(new String("Size") );
          ColumnSize.setMinWidth(50); 
          ColumnSize.setMaxWidth(100);
        ColumnRmIcon.setHeaderValue(new String("Remove?") );
          ColumnRmIcon.setMaxWidth(100);
          ColumnRmIcon.setResizable(false);
    
        this.addColumn(ColumnName);
        this.addColumn(ColumnSize);
        this.addColumn(ColumnRmIcon);
    
        this.setShowVerticalLines(false);
        this.setShowHorizontalLines(true);
    this.setAutoCreateColumnsFromModel(true);
    
    this.addFile( new File("C:/temp/cfk.jpg") );
    }
    public void addFile(File file) {
        System.out.println("FileTable adding: " + file.getName() );
        if ( file.isDirectory() ) { 
            for ( File f : file.listFiles(Filter) ) {
                this.addFile(f);
            }
        } else { 
            if ( Filter.accept(file) ) {
                System.out.println("Accepting file; " + file.getName() );
                SelectedFiles.add(file);
                {
                    String name = file.getName();
                    Long size = new Long( file.length() );
                    String tempstr = new String("X");
    
                    System.out.println("RowItems before: " + Integer.toString(Model.getRowCount()) );
                    Model.addRow( new Object[] { name, size, tempstr } );
                    Model.fireTableDataChanged(); 
                    System.out.println("RowItems start : " + Integer.toString(Model.getRowCount()) );
                }
                System.out.println("Done Accepting file; " + file.getName() );
            }
        }
    }
    public Iterator<File> iterator() { 
        return SelectedFiles.iterator();
    }
    
    }
    

    在显示/可视化时,引发以下异常:

    Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 0 >= 0
    at java.util.Vector.elementAt(Vector.java:432)
    at javax.swing.table.DefaultTableModel.getValueAt(DefaultTableModel.java:622)
    at javax.swing.JTable.getValueAt(JTable.java:1903)
    at javax.swing.JTable.prepareRenderer(JTable.java:3911)
    at javax.swing.plaf.basic.BasicTableUI.paintCell(BasicTableUI.java:2072)
    at javax.swing.plaf.basic.BasicTableUI.paintCells(BasicTableUI.java:1974)
    at javax.swing.plaf.basic.BasicTableUI.paint(BasicTableUI.java:1897)
    at javax.swing.plaf.ComponentUI.update(ComponentUI.java:142)
    at javax.swing.JComponent.paintComponent(JComponent.java:743)
    at javax.swing.JComponent.paint(JComponent.java:1006)
    at javax.swing.JComponent.paintChildren(JComponent.java:843)
    at javax.swing.JComponent.paint(JComponent.java:1015)
    at javax.swing.JViewport.paint(JViewport.java:728)
    at javax.swing.JComponent.paintChildren(JComponent.java:843)
    at javax.swing.JComponent.paint(JComponent.java:1015)
    at javax.swing.JComponent.paintChildren(JComponent.java:843)
    at javax.swing.JComponent.paint(JComponent.java:1015)
    at javax.swing.JComponent.paintChildren(JComponent.java:843)
    at javax.swing.JComponent.paint(JComponent.java:1015)
    at javax.swing.JComponent.paintChildren(JComponent.java:843)
    at javax.swing.JComponent.paint(JComponent.java:1015)
    at javax.swing.JComponent.paintChildren(JComponent.java:843)
    at javax.swing.JComponent.paint(JComponent.java:1015)
    at javax.swing.JLayeredPane.paint(JLayeredPane.java:559)
    at javax.swing.JComponent.paintChildren(JComponent.java:843)
    at javax.swing.JComponent.paintWithOffscreenBuffer(JComponent.java:4979)
    at javax.swing.JComponent.paintDoubleBuffered(JComponent.java:4925)
    at javax.swing.JComponent.paint(JComponent.java:996)
    at java.awt.GraphicsCallback$PaintCallback.run(GraphicsCallback.java:21)
    at sun.awt.SunGraphicsCallback.runOneComponent(SunGraphicsCallback.java:60)
    at sun.awt.SunGraphicsCallback.runComponents(SunGraphicsCallback.java:97)
    at java.awt.Container.paint(Container.java:1709)
    at sun.awt.RepaintArea.paintComponent(RepaintArea.java:248)
    at sun.awt.RepaintArea.paint(RepaintArea.java:224)
    at sun.awt.windows.WComponentPeer.handleEvent(WComponentPeer.java:254)
    at java.awt.Component.dispatchEventImpl(Component.java:4060)
    at java.awt.Container.dispatchEventImpl(Container.java:2024)
    at java.awt.Window.dispatchEventImpl(Window.java:1791)
    at java.awt.Component.dispatchEvent(Component.java:3819)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:463)
    at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)
    

    我把头发扯了出来——我还没有找到这个非常简单的用例的根本原因。

    10 回复  |  直到 7 年前
        1
  •  16
  •   Dmitry    15 年前

    我认为您需要向TableModel添加列。您的代码将UI列添加到表中,但不将它们添加到模型中

        2
  •  19
  •   Nightfirecat peSHIr    13 年前

    我也讨论过这个问题(使用jlist和defaultlistmodel)。 德米特里的回答是对的。

    然而,还有一件事: 如果不在Swing的事件调度线程中修改模型,也可以引发此异常。

    执行以下操作可以帮助您避免此异常:

    SwingUtilities.invokeLater(new Runnable(){public void run(){
        //Update the model here
    }});
    

    http://www.javakb.com/Uwe/Forum.aspx/java-gui/3012/JList-JScrollPane-DefaultListModel-Updating

        3
  •  4
  •   jitter    15 年前

    德米特里是对的。替换

    this.addColumn(ColumnName);
    this.addColumn(ColumnSize);
    this.addColumn(ColumnRmIcon);
    

    具有

    Model.addColumn(ColumnName);
    Model.addColumn(ColumnSize);
    Model.addColumn(ColumnRmIcon);
    

    现在模型知道了columsn,当您试图向一个认为它有0列的模型添加一行时,它不会再抛出异常。

        4
  •  1
  •   Thimmayya    15 年前

    从jtable.setAutoCreateColumnsFromModel()API:

    “如果autoCreateColumnsFromModel从false更改为true,则此方法将调用CreateDefaultColumnsFromModel。”

    vector throws arrayindexoutofboundsException-如果索引超出范围(index<0 index>=size())

    我想表模型缺少列,正如dmitry建议的那样。

        5
  •  1
  •   Chris K    14 年前

    将代码替换为以下内容 在这里,您只需要删除第一行,对于所有行应该迭代该行。

    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);
       }
    
    }
    
        6
  •  1
  •   Bruno Vieira    12 年前

    另一问题 可以 使用时保持联系 RowSorter . 编辑模型时 行排序器 尝试 重新排序旧模型。它应该自动重新创建,并在表模型的每个更改上重新运行。

    你可以通过

    tableModel = new DefaultTableModel(data, columnNames);
    jTableSentence.setModel(tableModel);
    jTableSentence.setRowSorter(new TableRowSorter(tableModel));
    jTableSentence.setAutoCreateRowSorter(true);
    

    -海里

        7
  •  1
  •   Peter Tretyakov    10 年前

    我正面临这个问题,因为我在向jtable添加列和行,而不是向模型添加列和行。

    Object[][]rows = new Object[ ][ ] { {"a","b"} , {"c","d"} };
    Object[]columns = new Object[] {"column1","column2"};
    JTable table = new JTable();
    table.setModel(new DefaultTableModel(rows,columns));
    
        8
  •  0
  •   yuriy    13 年前

    代替

    tabWindow.addTab(...);
    

    具有

    SwingUtilities.invokeLater(new Runnable() {
        @Override public void run() {
            tabWindow.addTab(...);
        }
    });
    

    当您在ActionListener中更改选项卡式窗格时,可能会发生这种情况。

        9
  •  0
  •   Eldorim    8 年前

    dmitry是对的,但您只需更新您的模型。 要执行此操作,请在代码中添加以下内容:

    DefaultTableModel dtm = (DefaultTableModel) table.getModel();
    for (int c = 0; c < table.getColumnCount(); c++) {
    dtm.addColumn(table.getColumnName(c));
    }
    
        10
  •  0
  •   chamzz.dot    7 年前

    有必要增加 isCellEditable 方法,返回false。

    @Override
      public boolean isCellEditable(int row, int column)
      {
        return false;
      }