当前位置:编程学习 > JAVA >>

跪求解决JTable删除多行后,数据越界问题

1,删除勾选行(注我是从行号由大到小删除的,代码中注释的都是我试过方法,可是不行)。
//删除转回操作行
final DefaultTableModel tableModel= (DefaultTableModel) tblBillInfo.getModel();
System.out.println("---------a: "+ tblBillInfo.getRowCount());
for (int i = 0; i < idxs.length; i++) {
// tableModel.fireTableRowsDeleted((int) idxs[i], (int) idxs[i]);
tableModel.removeRow((int) idxs[i]);
// tableModel.getDataVector().remove((int) idxs[i]);
// tableModel.fireTableRowsDeleted((int) idxs[i], (int)
// idxs[i]);
// final int t = (int) idxs[i];
// System.out.println("---------t: "+ t);
// Runnable remover = new Runnable() {
// public void run() {
// tableModel.removeRow(t);
// }
// };
// SwingUtilities.invokeLater(remover);
}
tblBillInfo.revalidate();
// tblBillInfo.repaint();
// tblBillInfo.invalidate();
//tblBillInfo.updateUI();
System.out.println("---------b: " + tblBillInfo.getRowCount());
//SwingUtilities.isEventDispatchThread();
//tblBillInfo.dispatchEvent(e);

2,勾选点击删除后,没有报错,能正常删除,但是当我再去界面,勾选记录时却报错误了
Exception in thread "AWT-EventQueue-0" 
java.lang.ArrayIndexOutOfBoundsException: 4 >= 3
at java.util.Vector.elementAt(Vector.java:432)
at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:637)
at javax.swing.JTable.setValueAt(JTable.java:1926)
at javax.swing.JTable.editingStopped(JTable.java:3339)
at javax.swing.AbstractCellEditor.fireEditingStopped(AbstractCellEditor.java:124)
at javax.swing.DefaultCellEditor$EditorDelegate.stopCellEditing(DefaultCellEditor.java:334)
at javax.swing.DefaultCellEditor.stopCellEditing(DefaultCellEditor.java:219)
at com.sf.semiautomatic.identify.UI.component.MyCellEditor.stopCellEditing(MyCellEditor.java:57)
at javax.swing.JTable.editCellAt(JTable.java:2667)
at com.sf.semiautomatic.identify.UI.component.JLightEditTable.editCellAt(JLightEditTable.java:47)
at javax.swing.plaf.basic.BasicTableUI$Handler.adjustFocusAndSelection(BasicTableUI.java:955)
at javax.swing.plaf.basic.BasicTableUI$Handler.mousePressed(BasicTableUI.java:922)
at java.awt.AWTEventMulticaster.mousePressed(AWTEventMulticaster.java:222)
at java.awt.AWTEventMulticaster.mousePressed(AWTEventMulticaster.java:221)
at java.awt.Component.processMouseEvent(Component.java:5498)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3135)
at java.awt.Component.processEvent(Component.java:5266)
at java.awt.Container.processEvent(Container.java:1966)
at java.awt.Component.dispatchEventImpl(Component.java:3968)
at java.awt.Container.dispatchEventImpl(Container.java:2024)
at java.awt.Component.dispatchEvent(Component.java:3803)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4212)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3889)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3822)
at java.awt.Container.dispatchEventImpl(Container.java:2010)
at java.awt.Window.dispatchEventImpl(Window.java:1778)
at java.awt.Component.dispatchEvent(Component.java:3803)
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)

--------------------编程问答-------------------- 3,报错地方我为1中tblBillInfo的定义类
package com.sf.semiautomatic.identify.UI.component;

import javax.swing.JTable;
import javax.swing.Action;
import java.util.EventObject;
import javax.swing.SwingUtilities;
import java.awt.Component;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JTextField;
import javax.swing.KeyStroke;
import javax.swing.AbstractAction;
import java.awt.event.ActionEvent;
import javax.swing.table.TableCellEditor;

public class JLightEditTable extends JTable {
    // actions to be put into editor's actionMap
    protected Action rightAction;
    protected Action leftAction;
    protected Action upAction;
    protected Action downAction;
    protected Action enterAction;
    /*  SPACE fast key for SAP 2.0 */
    /*  author LiuJia */
    /*  2006-06-09 */
    protected Action spaceAction;
    /*  end */
    protected boolean preMerlin;
    protected Action mappingAction = null;

    public JLightEditTable() {
        super();
        initJavaVersion();
    }

    public JLightEditTable(int row, int col) {
        super(row, col);
        initJavaVersion();
    }

    public void setMappingListener(Action act){
        mappingAction = act;
    }

    public boolean editCellAt(int row, int col, EventObject e) {
     System.out.println("-------------row: " +row + " col: "+col);
        if (super.editCellAt(row, col, e)) {
            hackFocusForEditorComponent();
            // need to invoke because of new focus architecture
            SwingUtilities.invokeLater(new Runnable() {public void run() {
                replaceEditorNavigation();
            }
            });
            return true;
        }
        return false;
    }

    //---------------------------helper in fact this is where the music plays

    /** PRE: isEditing();
     */
    protected void hackFocusForEditorComponent() {
        // dont care about surrender - always request focus on comp
        getEditorComponent().requestFocus();
        if (!preMerlin) {
            // **** merlin beta 3
            // hack around submitted bug (review ID 135159):
            // tabbing out of an editing combo focus the next comp
            // _outside_ the table
            Component c = getEditorComponent();
            if (getEditorComponent() instanceof JComboBox) {
                JComboBox box = (JComboBox) getEditorComponent();
                if (box.isEditable()) {
                    ( (JComponent) box.getEditor().getEditorComponent()).
                        setNextFocusableComponent(this);
                }
            } else if (getEditorComponent() instanceof JTextField) {
                JTextField txt = (JTextField) getEditorComponent();
                txt.selectAll();
            }
        }
    }

    /** replaces the left/right arrow key bindings in editorComponent
     * with wrappers around table's navigational actions.
     */
    protected void replaceEditorNavigation() {
        JComponent focused = findFocused();
        if (focused != null) {
//                replaceEditorNavigation(focused, "RIGHT", "right",
//                                        getRightAction());
//                replaceEditorNavigation(focused, "LEFT", "left", getLeftAction());
            replaceEditorNavigation(focused, "UP", "up",
                                    getUpAction());
            replaceEditorNavigation(focused, "DOWN", "down",
                                    getDownAction());
            replaceEditorNavigation(focused, "ENTER", "enter",
                                    getEnterAction());
            /*  SPACE fast key for SAP 2.0 */
            /*  author LiuJia */
            /*  2006-06-09 */
            replaceEditorNavigation(focused,"SPACE","space",
                                    getSpaceAction());
            /*  end  */
        }
    }

    protected void replaceEditorNavigation(JComponent realEditor,
                                           String keyName,
                                           String tableActionName,
                                           Action tableAction) {
        KeyStroke navigationKey = KeyStroke.getKeyStroke(keyName);
        Object editorActionValue = (String) realEditor.getInputMap().get(
            navigationKey);
        // nothing registered for the key, so we have to put it in first
        if (editorActionValue == null) {
            editorActionValue = tableActionName;
            realEditor.getInputMap().put(navigationKey, editorActionValue);
        }
        realEditor.getActionMap().put(editorActionValue, tableAction);
    }

    protected Action getRightAction() {
        if (rightAction == null) {
            rightAction = createWrappedAction(this,
                                              getActionMap().get(
                "selectNextColumnCell"));
        }
        return rightAction;
    }

    protected Action getUpAction() {
        if (upAction == null) {
            upAction = createWrappedAction(this,
                                              getActionMap().get(
                "selectPreviousRowCell"));
        }
        return upAction;
    }

    protected Action getDownAction() {
        if (downAction == null) {
            downAction = createWrappedAction(this,
                                              getActionMap().get(
                "selectNextRowCell"));
        }
        return downAction;
    }

    protected Action getEnterAction() {
        if (enterAction == null) {
            enterAction = createWrappedAction(this,
                                              getActionMap().get(
                "selectNextRowCell"));
        }
        return enterAction;
    }

    /*  SPACE fast key for SAP 2.0 */
    /*  author LiuJia */
    /*  2006-06-09 */
    protected Action getSpaceAction() {
        if (spaceAction == null) {
          spaceAction = createWrappedAction(this,
                                            getActionMap().get(
              "selectNextRowCell"));
        }
        return spaceAction;
    }
    /*  end  */

    protected Action getLeftAction() {
        if (leftAction == null) {
            leftAction = createWrappedAction(this,
                                             getActionMap().get(
                "selectPreviousColumnCell"));
        }
        return leftAction;
    }

    protected Action createWrappedAction(final Object source,
                                         final Action action) {
        // have to replace the original actionevent with one pointing to
        // the table as source
        Action wrappedAction = new AbstractAction() {
            public void actionPerformed(ActionEvent e) {
                ActionEvent newEvent = new ActionEvent(source, e.getID(),
                    e.getActionCommand(), e.getModifiers());

                if (mappingAction != null) mappingAction.actionPerformed(newEvent);
                action.actionPerformed(newEvent);
            }
        };
        return wrappedAction;
    }

    /** returns the component that has the focus in editorComponent.
     * PRE: isEditing()
     */
    protected JComponent findFocused() {
        Component result = SwingUtilities.findFocusOwner(getEditorComponent());
        if (result instanceof JComponent) {
            return (JComponent) result;
        }
        return null;
    }

    //---------------------------init ui

    protected void initJavaVersion() {
        String version = System.getProperty("java.vm.version");
        preMerlin = (version == null) || !version.startsWith("1.4");
    }

    public void refresh(){
        Action a = getEnterAction();
        if (a != null ){
            ActionEvent ae = new ActionEvent(this, 0, "enter");
            a.actionPerformed(ae);
        }
    }

    public boolean stopEditing(boolean yes)
    {
    if(isEditing()) {
        int col = getEditingColumn();
        int row = getEditingRow();
        try {
            TableCellEditor ce = getCellEditor( row, col );
            if( yes ) {
                return ce.stopCellEditing();
            } else {
                ce.cancelCellEditing();
                return true;
            }
        } catch( Exception e ) {
            System.out.println( "Error: " + e.toString() );
            return false;
        }
    }
    return true;
}

}


报错的地方为上面代码 if (super.editCellAt(row, col, e)) {
这个地方报的 --------------------编程问答-------------------- 4,去掉代码中的,默认行选表格事件,后不报异常。加上则报异常,但异常是在这个事件之前报的。

tblBillInfo.addFocusListener(new FocusListener() {
public void focusGained(FocusEvent e) {
int row = tblBillInfo.getSelectedRow();
tblBillInfo.editCellAt(row, 3);
}

public void focusLost(FocusEvent e) {
}
});

大体情况就是如上所描述,请网上的高手指点一下,谢谢了。 --------------------编程问答-------------------- 用TableModel的removeRow(index)方法。
要注意一点,调用此方法后是立即生效,即如果有10行,你删除了其中的一行,那么剩下9行。
如果是删除多行,这样写肯定就不对:
for(int i=0;i<tableModel.getRowCount();i++) {
    tabmeModel.removeRow(i);
}
这样会报越界。
应该这样写:
for(int i=tableModel.getRowCount()-1;i>=0;i--) {
    tableModel.removeRow(i);
}
补充:Java ,  Java SE
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,