如何使用JTable显示动态数据列表

时间:2014-02-01 22:14:45

标签: java swing jtable

我是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

1 个答案:

答案 0 :(得分:4)

当你致电MessageListGeneral.add时,它需要发出某种通知,告诉已注册的听众有新消息可用。

然后,这些听众需要适当地对该事件作出反应。在您的情况下,您需要确定添加的行并使用fireTableRowsInserted,这将通知JTable它应该重新绘制。

这是一个基本的observer pattern