所以我有一个大的cardlayout,其中一个面板作为JTable:
tbm = new DefaultTableModel();
tbm.addColumn("Account Number");
tbm.addColumn("PIN");
tbm.addColumn("Access Level");
tbm.addColumn("Balance");
table = new JTable(tbm);
JScrollPane scrollPane = new JScrollPane(table);
在actionPerformed下,我试图将一些数据加载到表中,如下所示:
else if(event.getSource() == listallButton) {
String query = "SELECT * FROM ATM";
String delimiter = ",";
String input = "go";
int count=0;
al = new ArrayList<String>();
try {
communicationObject = new DataObject();
communicationObject.setMessage(query);
Socket socketToServer = new Socket("sunlab32.njit.edu",31414);
ObjectOutputStream myOutputStream = new ObjectOutputStream(socketToServer.getOutputStream());
ObjectInputStream myInputStream = new ObjectInputStream(socketToServer.getInputStream());
myOutputStream.writeObject(communicationObject);
communicationObject = (DataObject)myInputStream.readObject();
input = communicationObject.getMessage();
if (input != "stop") {
al.add(input);
data[count] = input;
count++; }
for (int i=0;i<data.length;i++) {
row = data[i];
temp = row.split(delimiter);
tbm.addRow(new String[] {temp[0],temp[1],temp[2],temp[3]}); }
tbm.fireTableDataChanged();
table.repaint();
现在我的问题是,在加载所有行后,表格没有重新绘制...有任何建议吗?
答案 0 :(得分:4)
tbm.addModel
应该触发表更改事件,因此不需要tbm.fireTableDataChanged
。
您可以尝试这样做,但在添加完所有行后强制它自己绘制。
table.setModel(tbm);
非主题:
Swing是一个单线程事件模型,这意味着您正在执行的任务将阻止UI更新。
我建议您将数据加载到SwingWorker,一旦完成更改,就可以在UI上推送数据。看一下这个tutorial
答案 1 :(得分:1)