【发布时间】:2014-02-25 13:57:14
【问题描述】:
我是Java新手,所以如果这个问题很愚蠢,请不要这么难。
我有问题。我想在列表中显示传入的消息。所以我选择了一个 JTable,带有一个 AbstractTableModel 和一个静态 LinkedList。
Table的初始化如下:
jScrollPane1 = new javax.swing.JScrollPane();
jTable1 = new javax.swing.JTable();
jTable1.setModel(new MessagesTableModel());
jScrollPane1.setViewportView(jTable1);
我的 AbstractTableModel 如下所示:
public class MessagesTableModel extends AbstractTableModel {
private static List<MsgGeneral> data;
// Specify the types of columns. -> constructor
Class[] types;
private static String[] COLUMN_NAMES = {
"Timestamp",
"Length",
"Direction",
"Header",
"Content"
};
public MessagesTableModel() {
//define column types
types = this.types = new Class[]{
String.class,
Integer.class,
String.class,
Integer.class,
Object.class};
data = MainThread.MessageListGeneral;
}
@Override
public String getColumnName(int column) {
return COLUMN_NAMES[column];
}
@Override
public Class getColumnClass(int columnIndex) {
return types[columnIndex];
}
@Override
public int getRowCount() {
return data.size();
}
@Override
public int getColumnCount() {
return types.length;
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return false;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
MsgGeneral msg = data.get(rowIndex);
switch (columnIndex) {
case 0:
return msg.getTimestamp();
case 1:
return msg.getMsgLenght();
case 2:
return msg.getDirection();
case 3:
return msg.getHeader();
case 4:
return msg.getContent().toString();
default:
return null;
}
}
List 的定义简单如下:
public static LinkedList<MsgGeneral> MessageListGeneral = new LinkedList<MsgGeneral>();
我这样填写这个列表:
MessageListGeneral.add(new MsgGeneral(data.length, 0, header, "some note", data));
现在是我的问题,或者我不明白的问题: 添加新行时,如何动态刷新表格?我想我需要.NET 中的 ObservableCollection 之类的东西,或者“添加”上的事件侦听器。我该怎么做。
非常感谢您的每一个提示 亚历克斯
【问题讨论】:
-
我强烈推荐 Glazed Lists 来解决这类问题,它为您处理了大量工作,并提供了一种线程安全的方法来非常轻松地完成此任务。 glazedlists.com/documentation/tutorial