About JTable - 两段相同的代码为何结果不同?

KingSunSha 2003-01-14 09:39:09
初学java,有点问题请教各位,见下面的代码:

import javax.swing.*;
import javax.swing.table.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*;


public class testTable extends JFrame {
//default constructor
public testTable() {
//define column names
Vector columnNames = new Vector();
columnNames.addElement("Date");
columnNames.addElement("Project");
columnNames.addElement("# of Hours");
columnNames.addElement("Text");

//define colomun values
Vector colVal = new Vector();
colVal.addElement("C1");
colVal.addElement("C2");
colVal.addElement("C3");
colVal.addElement("C4");

//define row data (1 row)
Vector rowData = new Vector();
rowData.addElement(colVal);

//create a table model
DefaultTableModel model = new DefaultTableModel();
model.setDataVector(rowData,columnNames);

//create a JTable
JTable tblReport=new JTable(model);
tblReport.setPreferredScrollableViewportSize(new Dimension(500,70));

//after table created, add another row with the same row data
rowData=new Vector(); // ==========标记1===============
// 这一行非常重要,如果不重置rowData,
// 系统会抛出NullPointerException
// table也不会显示出来
rowData.addElement(colVal); // ==========标记2===============
// 新增的这个纪录中会把4个column values
// 显示在一个格子中。

DefaultTableModel dtm = (DefaultTableModel) tblReport.getModel();
dtm.addRow(rowData);
tblReport.setModel(dtm); // ==========标记3===============
// 如果把整段增加纪录的代码移到别的method中,
// 比如用一个event来触发,
// 则不会发生上述的错误。

JScrollPane jScrollPane1=new JScrollPane(tblReport);
this.getContentPane().add(jScrollPane1);

this.pack();
this.setVisible(true);
try {
jbInit();
} catch(Exception e) {
e.printStackTrace();
}
}

public static void main(String[] args) {
testTable testTable = new testTable();
}

private void jbInit() throws Exception {
this.addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(WindowEvent e) {
this_windowClosing(e);
}
});
}

private void this_windowClosing(WindowEvent e) {
System.exit(0);
}
}

问题:
标记1:为什么一定要重置rowData?
标记2:为什么4个values显示在一个column中?
标记3:为什么移动后工作正常?

谢谢!
...全文
32 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Apocalypse 2003-01-18
  • 打赏
  • 举报
回复
JTable里的一个Row纪录应该是一个一维表,而你的rowData中add了另一个向量,成了二维表。
正确的rowData应该是{"C1", "C2", "C3", "C4"},而你现在的rowData却是{{"C1", "C2", "C3", "C4"}},系统认为这个rowData只包含一个value,于是整个ColVal被作为一个value被加入JTable的第一列(这就是为什么4个values显示在一个column中),而你的JTable有四列,添加第二列数据时就会出错。

如果要改进,rowData我感觉根本没必要使用,就算使用了,也不用再次做new,把原来的元素clear掉就行了。还有对于rowData这样的Vector对象,尽量使用.add()这样在List接口中申明的方法,而不要用addElement()。
KingSunSha 2003-01-18
  • 打赏
  • 举报
回复
谢谢beyond_xiruo(希偌)兄。把这些行都注释掉当然没有问题了。
但是我要完成的功能是用一个vector生成一个dtm然后马上再加入一行,结果出错了。这是为什么?
我刚刚学java,才一个星期,问题多多,每天花大量的时间看api文档。希望以后能多指教。
希偌 2003-01-14
  • 打赏
  • 举报
回复
我倒,那么简单的问题,何必想那么复杂,改如下:
//rowData=new Vector(); // ==========标记1===============
//这里注释掉 // 这一行非常重要,如果不重置rowData,
// 系统会抛出NullPointerException
// table也不会显示出来
rowData.addElement(colVal); // ==========标记2===============
// 新增的这个纪录中会把4个column values
// 显示在一个格子中。

//DefaultTableModel dtm = (DefaultTableModel) tblReport.getModel();这里也注释
//dtm.addRow(rowData);这里也
//tblReport.setModel(dtm);这里也 // ==========标记3===============
// 如果把整段增加纪录的代码移到别的method中,
// 比如用一个event来触发,
// 则不会发生上述的错误。
KingSunSha 2003-01-14
  • 打赏
  • 举报
回复
谢谢楼上。
1、按照如你所说的把标记1处改成colVal,工作正常。但是为什么在初始化model以前我必须建立Vector rowData并且用model.setDataVector(rowData,columnNames)来设定,而不能用colVal来取代rowData?否则会报错:ClassCastException:java.lang.String。应该是colVal无法进行类型转换。
3的问题是指如果我把这段用来新增一列的代码在一个mouse click event中执行,则是完全没有问题的。为什么?
crm2000 2003-01-14
  • 打赏
  • 举报
回复
1.这里重置rowData没什么意义,应该重置colVal,然后往colVal中写入数据,后面那句dtm.addRow(rowData)改成dtm.addRow(colVal)这样就不会出现标记2所说的问题。
3的问题不知道你所说的是什么问题

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧