gpt4 book ai didi

java - JMS 队列到 JTable 更新 [现在在更改后出现异常]

转载 作者:行者123 更新时间:2023-12-02 08:36:24 27 4
gpt4 key购买 nike

我正在编写自己的 JMS 浏览器,并且对来自 JMS 服务器的消息的 JTable 更新感到震惊。 我尝试过AbstractTableModel TableModelListener在数据添加到LinkedList时使Jtable刷新。下面的逻辑有效,但它不实时更新,意味着我希望在从 QueueBrowser 添加到 LinkedList 时立即显示添加到 Jtable 的每一行。

我已根据以下建议更新了代码。

我做错了什么吗?谁能帮我吗?

QueueBrowser qb = session.createBrowser(q);
MsgTable mt = (MsgTable) queueTable.getModel();
mt.load(qb.getEnumeration(),mt);
qb.close();




class MsgTable extends AbstractTableModel implements TableModelListener{


final String[] columnNames = { "#", "Timestamp", "Type", "Mode",
"Priority" };

public void setRowSize(){

}
LinkedList queueList = new LinkedList();

public int getRowCount() { if (queueList == null) { return 0; } else { return queueList.size();}}
public int getColumnCount() { return columnNames.length;}
public String getColumnName(int column) {return columnNames[column];}

public Object getValueAt(int row, int column) {
if(queueList == null){
return null;
}
Message m = (Message) queueList.get(row);
...
}

void load(Enumeration e,MsgTable mt) {
mt.addTableModelListener(this);
while(e.hasMoreElements()){
queueList.add(e.nextElement());

}
fireTableDataChanged();
}

Message getMessageAtRow(int row) {
if (queueList == null)
return null;
return ((Message) queueList.get(row));
}

@Override
public void tableChanged(TableModelEvent arg0) {
// TODO Auto-generated method stub
fireTableDataChanged();
}

}

并得到这个异常。

Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError  at javax.swing.table.AbstractTableModel.fireTableRowsInserted(Unknown Source)

有错吗?

最佳答案

据我所知,您的JTableTableModel 更改时应该自动更新发生。查看 working with tables 上的 sun 教程特别是 listening for data changes 部分,这可能有帮助。也就是说,我有几点评论:

  • 我不太明白 getValueAt(int row, int col)方法。难道你不应该获取第 row-th 消息和消息的 col-th 属性吗?

  • 我会添加 addRow(...)addRows(...)MsgTable实现 TableModel 来更新内部模型并触发适当的事件。

  • 您不需要实现TableModelListener (无论如何,我看不到任何对 addTableModelListener(...) 的调用)

(编辑:OP已使用新代码更新了他的问题,因此我在下面相应地更新了我的答案。)

您已修改 load(...)签名和正文以添加对 addTableModelListener(...) 的调用我认为这两种修改都是不正确的。

关于addTableModelListener(...) ,文档说:

Adds a listener to the list that is notified each time a change to the data model occurs.

关于各种fireFooXxx(...)方法:

Notifies all listeners that [a changed occurred]

因此,执行以下 TableModelListener :

@Override
public void tableChanged(TableModelEvent arg0) {
// TODO Auto-generated method stub
fireTableDataChanged();
}

您最终将进行无限递归调用(监听器收到更改通知并触发一个事件再次通知他等),因此 java.lang.StackOverflowError .

其实我还是觉得你不需要TableModelListener (并且您注册的方式在我看来是不正确的,请参阅Sun教程中的Listening for Data Changes)。因此,我会删除 implements TableModelListener而是实现load(...)方法如下:

void load(Enumeration e) {
while(e.hasMoreElements()) {
queueList.add(e.nextElement());
}
fireTableDataChanged();
}

关于java - JMS 队列到 JTable 更新 [现在在更改后出现异常],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1624679/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com