2010-09-08 121 views
2

我有一個綁定到我的EventTracker bean的JTable,本質上是一個包含在我將用作append/clear(即簡單日誌)的列表的包裝器。問題是,當我將條目添加到列表並嘗試觸發事件時,我沒有看到任何更改。我正在使用NetBeans IDE。綁定數據觸發更改後沒有更新的Swing/JTable

EventTracker bean被添加到視圖並實例化爲eventTracker1。從那裏,我右鍵單擊表格並選擇'表格內容...'。表模型綁定到eventTracker1,綁定表達式是'$ {eventList}'。這些列設置正確,以便對eventList中的條目進行操作。

// From inside EventTracker.java 
public static final String EVENT_LIST_PROPERTY = "eventList"; 
public List getEventList() { 
    System.out.println("Handing out eventList with size: " + Integer.toString(eventList.size())); 
    return eventList; 
} 

public void setEventList(List incomingList) { 
    List oldList = eventList; 
    eventList = new ArrayList(incomingList); 
    propertySupport.firePropertyChange(EVENT_LIST_PROPERTY, oldList, eventList); 
} 

的方法中的firePropertyChange似乎當我之外的代碼上setEventList工作,以適應specSo,似乎因爲那時getEventList被調用,列表大小正在上升的預期激發關閉事件。只是表格沒有渲染。我能做些什麼來完成這項工作?

回答

2

假設您的數據模型來自AbstractTableModel,您可以顯式更新模型並激發在抽象父級中實現的適當更新方法。此外,更新必須在EDT上進行,通常使用invokeLater()。另請參閱Listening for Data ChangesFiring Data Change Events

EventQueue.invokeLater(new Runnable() { 

    @Override 
    public void run() { 
     // update model, which should fire the appropriate event 
    } 
}); 
0

你需要告訴數據模型變化表:

.fireTableDataChanged()

是正確的方法;假設您的表從傳統表格模型下降。

(所以是的,我同意trashgod)

1

我是在獲取數據綁定工作真正意圖。建議的答案是很好的閱讀,但會導致我寫很多代碼。我不想處理給出行數/列數邏輯和所有額外的工作。因此,此解決方案可能會提供較少的控制,但對於此只讀工作流程非常快捷。

http://swinglabs.org/docs/presentations/2007/DesktopMatters/beans-binding-talk.pdf的文件給了我一個瘦。訣竅是使用ObservableCollection/ObservableList(new ArrayList<Event>)作爲數據存儲。無論何時添加其他條目,它都會自動反映在JTable中。

太棒了!

0

目前尚不清楚你是如何綁定的EventTracker類的table.I'm假設你使用相應的編輯器和渲染器類,然後設置渲染和這樣table.setDefaultRenderer(EventTracker.class,new EventTrackerRender());table.setDefaultEditor(EventTracker.class,new EventTrackerEditor());。編輯編輯器的情況下使用只有當您需要通過表更改EventTracker bean時。

如果它從表外(即通過代碼)完成覆蓋Table模型中的setValueAt函數,然後使用getValueAt獲取EventTracker對象(它是當前對象)並進行必要的更改(如果Eventtracker是可變對象)。在不可變對象的情況下,創建EventTracker的新對象並將其設置爲對象數組。在此之後,您應該調用fireTableDataChanged()這將重新繪製整個表格或調用fireTableCellUpdated(row,col)以使特定單元格再次呈現。

相關問題