我是Java的新手,所以如果这个问题非常愚蠢,请不要这么难。
我有问题。我想在列表中显示传入的消息。所以我选择了一个带有AbstractTableModel和静态LinkedList的JTable。
表的初始化如下所示:
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;
}
}
列表的定义如下:
public static LinkedList<MsgGeneral> MessageListGeneral = new LinkedList<MsgGeneral>();
我填写这个列表:
MessageListGeneral.add(new MsgGeneral(data.length, 0, header, "some note", data));
现在是我的问题,或者我不明白的事情: 添加新行时,如何动态刷新表格?我想我需要像.NET中的ObservableCollection或“add”上的事件监听器。我怎么能这样做。
非常感谢每一个提示 br Alex
答案 0 :(得分:4)
当你致电MessageListGeneral.add
时,它需要发出某种通知,告诉已注册的听众有新消息可用。
然后,这些听众需要适当地对该事件作出反应。在您的情况下,您需要确定添加的行并使用fireTableRowsInserted
,这将通知JTable
它应该重新绘制。
这是一个基本的observer pattern