About JTable - 两段相同的代码为何结果不同?
初学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:为什么移动后工作正常?
谢谢!