/**
* 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的东西,砍了你,”呵呵
* 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的东西,砍了你,”呵呵
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);
}
}你曾经的内存溢出肯定是其它的问题.
to geyf(其实我也不会) :我用的是jdk1.4.1,总是出错,狂点程序就死了
to hlding(淋东):错误信息如下:java.lang.ArrayIndexOutOfBoundsException: 3 >= 1
但是并不总是3>=1,5>=4等什么都有,所以可以排除是超过vector范围造成的
Vector的方法确实都是同步保护的,但是楼主的现象应该看起来和同步没有直接关系.
for(int i=0;i<1000000;i++)
combo.addItem(i+"");
* <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
*/
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();
}
}}
My_ActionListener
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里面就是这段代码,好好分析一下吧...:)
// 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 里面的,所以调用这个函数,问题应该就出在这个函数里