2009-10-26 5 views
0

저는 독자적인 JMS 브라우저를 작성 중이며 JMS 서버의 메시지에 대한 JTable 업데이트를 받았습니다. LinkedList에 데이터를 추가 할 때 AbstractTableModelTableModelListener으로 Jtable을 새로 고쳤습니다. 아래 logis가 작동하지만 실시간으로 업데이트되지 않는다는 것은 QueueBrowser에서 LinkedList로 추가 될 때 Jtable에 추가 된 모든 행을 즉시 표시하고 싶다는 것을 의미합니다.JMS 대기열에서 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) 

잘못 되었나요?

+0

이 코드는 이론적으로 좋아 보인다. 당신의 실제 문제는 무엇입니까? – jarnbjo

+0

@jambjo, 잘 작동하지만 Jtable은 목록이 모든 데이터를 가져오고 LinkiedList에 추가 된 링크가 – ukanth

답변

1

내 지식에 따라 으로 변경하면 JTable이 자동으로 업데이트됩니다. working with tables에 관한 태양 자습서와 특히 listening for data changes에 관한 섹션을 확인하십시오. 그러면 도움이 될 것입니다.

  • 내가 정말 getValueAt(int row, int col) 방법을 얻을하지 않습니다 : 그건 내가 말 몇이 말했다. 행의 메시지와 메시지의 열 속성을 가져야하지 않습니까?

  • addRow(...)addRows(...) to MsgTable TableModel의 구현을 추가하여 내부 모델을 업데이트하고 적절한 이벤트를 발생 시키십시오.

  • 당신은

(EDIT (나는 어쨌든 addTableModelListener(...)에 모든 통화를 볼 수 없습니다) TableModelListener를 구현할 필요가 없습니다 : 영업 이익은 그래서 업데이트하고있어 새로운 코드와 자신의 질문을 업데이트했습니다 내 그에 따라 아래에 답하십시오.)

addTableModelListener(...)에 전화를 추가하기 위해 load(...) 서명과 본문을 수정했으며 두 수정이 모두 올바르지 않다고 생각합니다. addTableModelListener(...) 소개

이 문서는 말한다 :

데이터 모델이 변경 될 때마다 통지되는리스트에 청취자를 추가합니다.

그리고 다양한 fireFooXxx(...) 방법에 대한

:

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

:

은 [A 변화가 발생 즉, 모든 청취자 TableModelListener 다음 구현에 따라서

통지 무한 반복 호출을하게 될 것입니다 (리스너는 noti입니다. 변경에 의해 사기하고 다시 그를 알릴 이벤트 등을 발사), 따라서 java.lang.StackOverflowError.

실제로, 나는 여전히 당신이 TableModelListener을 필요로하지 않는다고 생각한다. (등록한 방식이 IMO가 올바르지 않다. 썬 튜토리얼의 Listening for Data Changes 참조). 나는 이렇게 implements TableModelListener 제거하고 오히려이 같은 load(...) 방법을 구현하는 것 :

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

감사합니다. 이것은 의미가있다, 내가 그것을 점검하고 되돌아 가게하자. – ukanth

0

성능을 향상시키는 한 가지 방법은 각 라인이로드 된 후에 load() 메소드의 끝에서 fireTableDataChanged()를 호출하는 것입니다.

도움이 될 것입니다.

예 :

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

void load(Enumeration e) throws JMSException { 
       boolean dataAdded = false; 
       while(e.hasMoreElements()){ 
         queueList.add(e.nextElement()); 
         dataAdded = true; 
        } 
       fireTableDataChanged(); 

     } 
+0

일 때 실시간 새로 고침을 표시하지 않을 때 데이터를 표시하지만 새 데이터가 추가되는 순간 Jtable을 업데이트하려고합니다. 그 목록. – ukanth

0

웰에 적절한 설계 데이터의 행을받는 addRow (...) 방법을 만들 수 있고 내부 저장소를 갱신하여 TableModel 이 메서드는 fileTableRowsInserted() 메서드를 호출해야합니다. getValueAt() 메소드도 의미가 없습니다. 모델에 따르면 5 열의 데이터가 있지만 적절한 열 객체를 반환하기 위해 열 변수를 확인하지 않습니다.

DefaultTableModel의 소스 코드를보고 insertRow() 및 getValueAt() 메서드를 코딩하는 방법을 확인하십시오.

1

몇 점을 고려 추가를 :

  • 당신의 load(Enumeration e) 방법은 같은 JMSException을 던질 필요가 없습니다 Enumeration을 반복합니다.
  • 귀하는 사건 발생이 EDT 내에서 이루어 졌는지 확인해야합니다. 이것은 실행 가능한에서 load에 전화를 포장하고 SwingUtilities.invokeLater()에 놓는 것처럼 간단 할 수있다 : 어떤 명백한 성능 문제를 제외하고

    MsgTable mt = (MsgTable) queueTable.getModel(); 
    final Enumeration e = qb.getEnumeration(); 
    SwingUtilities.invokeLater(new Runnable() { 
        public void run() { 
         mt.load(e); 
        } 
    }); 
    
관련 문제