/**
     *  Adds a column to the model.  The new column will have the
     *  identifier <code>columnName</code>, which may be null.  This method
     *  will send a
     *  <code>tableChanged</code> notification message to all the listeners.
     *  This method is a cover for <code>addColumn(Object, Vector)</code> which
     *  uses <code>null</code> as the data vector.
     *
     * @param   columnName the identifier of the column being added
     */
    public void addColumn(Object columnName) {
        addColumn(columnName, (Vector)null);
    }
//存在一个Vector中,出现异常不好说,你要有兴趣,可以研究这个类的源码.bug?我想应该不是吧,如果是,给sun发个mail,质问它“为什么老给大爷们用有bug的东西,砍了你,”呵呵

解决方案 »

  1.   

    我这没有问题啊,狂点也没抛。我用的版本是:java 1.3.1-b24你把这个方法同步了试试。
      

  2.   

    应该不是java的bug,因为你使用DefaultTableModel的addColumn()方法时,你的程序中是调用的addColumn(Object columnName);而Object,Vector等等之类的向量对象都是有长度限制的,在Vector的长度超过2000(我记得是2000)时就会出现下表越界的错误
      

  3.   

    我在工作中曾经用过JList(Vector a)之类的,在Vector中的向量长度超过2000(我记得是2000)时报内存溢出,下标越界错误
      

  4.   

    无意与纠缠楼主的问题,证明给 hlding(淋东) Vector的向量长度和2000没有关系.public class TestVectorLength extends TestCase {
        public TestVectorLength(String name) {super(name);}    public void testVectorLengthMoreThan2000() {
            Vector v = new Vector();
            boolean exception = false;
            try {
                for ( int i=0; i<2001; i++ ) {v.add(new Integer(i));}
            } catch(Exception ex) {
                exception = true;
            }
            assertFalse(exception);
        }
    }你曾经的内存溢出肯定是其它的问题.
      

  5.   

    to  kofwr(搭补流二) :这个问题确实存在,我的总是出错,不信你尝试一下
    to geyf(其实我也不会) :我用的是jdk1.4.1,总是出错,狂点程序就死了
    to hlding(淋东):错误信息如下:java.lang.ArrayIndexOutOfBoundsException: 3 >= 1
    但是并不总是3>=1,5>=4等什么都有,所以可以排除是超过vector范围造成的
      

  6.   

    to geyf(其实我也不会) :我用的是jdk1.4.1,总是出错,如果加上同步狂点程序就死了
      

  7.   

    是不是Vector这个类本身是同步的,老点,老向里面添加,就死了,以上是个人推测
      

  8.   

    to kofwr(搭补流二):
    Vector的方法确实都是同步保护的,但是楼主的现象应该看起来和同步没有直接关系.
      

  9.   

    我用的是JDK1.4.1_02b06没有任何问题.
      

  10.   

    1.看源代码2.exception.printStackTrace(out)看看是哪儿的错误
      

  11.   

    看看你是在什么样的情况下触发这个setTable()方法?跟踪过吗?跟几次看看
      

  12.   

    我就是通过点击JFrame上的一个Button调用这个方法,连续点击就会出现下标越界的错误
      

  13.   

    是你自己的程序的问题,看看你重载的DefaultTableModel是否有问题,要不然就是程序的其他部分影响了你。
      

  14.   

    我没有重载DefaultTableModel呀,看我的代码就知道了,多么单纯呀
      

  15.   

    一定是楼主其他地方出错了,偶试了各种JRE都没有出现楼主所说的Exception
      

  16.   

    Vector没有长度限制,你点的越多,Vector加的越多。最后内存就溢出了嘛!当然要死了。
      

  17.   

    但是我今天下午试过,如果在JComboBox的下拉框中的项目超过1000000时就会报内存溢出错误,证实代码:
    for(int i=0;i<1000000;i++)
      combo.addItem(i+"");
      

  18.   

    package advancedts;/**
     * <p>Title: AdvanceDTS</p>
     * <p>Description: Advance Data Transfer Services</p>
     * <p>Copyright: Copyright (c) 2003</p>
     * <p>Company: Amjn Tech</p>
     * @author amjn
     * @version 1.0
     */public class AdvanceDTS {  public static void main(String[] args){
        new MainGUI();
      }
    }package advancedts;import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.tree.*;
    import javax.swing.table.*;
    import java.util.*;
    /**
     * <p>Title: AdvanceDTS</p>
     * <p>Description: Advance Data Transfer Services</p>
     * <p>Copyright: Copyright (c) 2003</p>
     * <p>Company: Amjn Tech</p>
     * @author amjn
     * @version 1.0
     */
      

  19.   


    public class MainGUI extends JFrame {
      JToolBar jToolBar;
      JButton jButtonImport,jButtonExit;
      JMenuBar jMenuBar;
      JMenu jMenuFile,jMenuEdit;
      JMenuItem jMenuItemImport,jMenuItemSeperator1,jMenuItemExit;
      JTree jTree;
      JTable jTable;
      JSplitPane jSplitPane;
      BorderLayout borderLayout,borderLayoutTree,borderLayoutTable;
      JPanel jPanel,jPanelLeft,jPanelRight;  public MainGUI(){
        //---得到内容窗口
        jPanel=(JPanel)this.getContentPane();
        //---创建布局管理器
        borderLayout=new BorderLayout();
        jPanel.setLayout(borderLayout);
        //---构建树
        DefaultMutableTreeNode root=new DefaultMutableTreeNode("Amjn导入模版包",true);
        DefaultMutableTreeNode subRoot1=new DefaultMutableTreeNode("塑料国际",false);
        DefaultMutableTreeNode subRoot2=new DefaultMutableTreeNode("有机国际市场",false);
        jTree=new JTree(root);
        jPanelLeft=new JPanel();
        borderLayoutTree=new BorderLayout();
        jPanelLeft.setLayout(borderLayoutTree);
        JScrollPane jScrollPane=new JScrollPane(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
        jScrollPane.setViewportView(jTree);
        jPanelLeft.add(jScrollPane,BorderLayout.CENTER);
        root.add(subRoot1);
        root.add(subRoot2);
        jTree.expandRow(0);
        jTree.addMouseListener(new My_MouseListener(this));
        //---构建表
        DefaultTableModel tableModel=new DefaultTableModel();
        jTable=new JTable(tableModel);
        jTable.setShowGrid(true);
        jTable.setAutoscrolls(true);
        jTable.setShowHorizontalLines(true);
        jTable.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN);
        jTable.setCellSelectionEnabled(true);
        jTable.setGridColor(Color.red);
        jTable.setRowHeight(25);
        jTable.setRowSelectionAllowed(false);
        jTable.getTableHeader().setReorderingAllowed(false);
        jTable.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
        jPanelRight=new JPanel();
        borderLayoutTable=new BorderLayout();
        jPanelRight.setLayout(borderLayoutTable);
        JScrollPane jScrollPaneTable=new JScrollPane(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
        jScrollPaneTable.setViewportView(jTable);
        jPanelRight.add(jScrollPaneTable,BorderLayout.CENTER);
        //---构建整体布局
        jSplitPane=new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,false);
        jSplitPane.setAutoscrolls(true);
        jSplitPane.setLeftComponent(jPanelLeft);
        jSplitPane.setRightComponent(jPanelRight);
        jSplitPane.setOneTouchExpandable(true);
        jSplitPane.setDividerSize(10);
        jSplitPane.setDividerLocation(200);
        jPanel.add(jSplitPane,BorderLayout.CENTER);
        //---构建菜单
        jMenuItemImport=new JMenuItem("导入");
        jMenuItemImport.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_I,KeyEvent.CTRL_MASK));
        jMenuItemExit=new JMenuItem("退出");
        jMenuItemExit.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_E,KeyEvent.CTRL_MASK));
        jMenuFile=new JMenu("Do");
        jMenuFile.add(jMenuItemImport);
        jMenuFile.insertSeparator(2);
        jMenuFile.add(jMenuItemExit);
        jMenuBar=new JMenuBar();
        jMenuBar.add(jMenuFile);
        this.setJMenuBar(jMenuBar);
        //---构建工具栏
        My_ActionListener my_ActionListener=new My_ActionListener(this);
        jToolBar=new JToolBar();
        jButtonImport=new JButton("导入数据库");
        jButtonImport.setToolTipText("将选中的结点数据导入数据库");
        jButtonImport.setActionCommand("导入");
        jButtonImport.addActionListener(my_ActionListener);
        jButtonExit=new JButton("退出程序");
        jButtonExit.setToolTipText("退出程序");
        jButtonExit.setActionCommand("退出");
        jButtonExit.addActionListener(my_ActionListener);
        jToolBar.setOrientation(JToolBar.HORIZONTAL);
        jToolBar.add(jButtonImport);
        jToolBar.addSeparator(new Dimension(10,0));
        jToolBar.add(jButtonExit);
        jPanel.add(jToolBar,BorderLayout.NORTH);    this.setTitle("Amjn导入");
        this.setSize(new Dimension(800,600));
        this.setResizable(true);
        double screenWidth=this.getToolkit().getScreenSize().getWidth();
        double screenHeight=this.getToolkit().getScreenSize().getHeight();
        double frameWidth=this.getSize().getWidth();
        double frameHeight=this.getSize().getHeight();
        this.setLocation((int)((screenWidth-frameWidth)/2),(int)((screenHeight-frameHeight)/2));
        this.show();
      }  public void setTable(Vector recordField,Vector headerField){
        if(recordField==null||headerField==null){
          JOptionPane.showMessageDialog(this,"系统初始化表时发生异常,请联系程序员.","警告",JOptionPane.INFORMATION_MESSAGE);
        }
      
        DefaultTableModel tableModel=(DefaultTableModel)jTable.getModel();
        tableModel.setColumnCount(0);
         tableModel.addColumn("amjn");
         tableModel.addColumn("amjn");
         tableModel.addColumn("amjn");
         tableModel.addColumn("amjn");
         tableModel.addColumn("amjn");  }  public void preViewTable(int mouseX,int mouseY){
        DefaultMutableTreeNode clickOnTreeNode=(DefaultMutableTreeNode)jTree.getPathForLocation(mouseX,mouseY).getLastPathComponent();
        if(!clickOnTreeNode.isLeaf()){
          return;
        }
        if(clickOnTreeNode.toString().trim().equals("塑料国际")){
          new Thread(new PlasInter(this),"PlasInter").start();
        }
      }}
      

  20.   

    看看这个:
    My_ActionListener
      

  21.   

    public void addColumn(Object columnName, Vector columnData) {
            columnIdentifiers.addElement(columnName); 
    if (columnData != null) { 
                int columnSize = columnData.size(); 
                if (columnSize > getRowCount()) { 
            dataVector.setSize(columnSize);
                }
        justifyRows(0, getRowCount()); 
        int newColumn = getColumnCount() - 1; 
        for(int i = 0; i < columnSize; i++) { 
      Vector row = (Vector)dataVector.elementAt(i);
      row.setElementAt(columnData.elementAt(i), newColumn); 
        }

            else { 
        justifyRows(0, getRowCount()); 
            }        fireTableStructureChanged();
        }java里面就是这段代码,好好分析一下吧...:)
      

  22.   

    private void justifyRows(int from, int to) { 
    // Sometimes the DefaultTableModel is subclassed 
    // instead of the AbstractTableModel by mistake. 
    // Set the number of rows for the case when getRowCount 
    // is overridden. 
    dataVector.setSize(getRowCount());         for (int i = from; i < to; i++) { 
        if (dataVector.elementAt(i) == null) { 
    dataVector.setElementAt(new Vector(), i); 
        }
        ((Vector)dataVector.elementAt(i)).setSize(getColumnCount());
    }
        }你那种情况应该是else 里面的,所以调用这个函数,问题应该就出在这个函数里