【问题标题】:How can I use a JTable to display dynamic a list of data如何使用 JTable 显示动态数据列表
【发布时间】: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 之类的东西,或者“添加”上的事件侦听器。我该怎么做。

非常感谢您的每一个提示 亚历克斯

【问题讨论】:

标签: java swing jtable


【解决方案1】:

当您调用 MessageListGeneral.add 时,它需要触发某种通知,告诉已注册的侦听器有新消息可用。

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

这是一个基本的observer pattern

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-12
    • 1970-01-01
    • 2012-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-05
    • 2021-02-13
    相关资源
    最近更新 更多