我有一系列線程定期檢索RSS源,並希望使用PropertyChangeSupport刷新自定義JTree。然而,它使用實現TreeModel的自定義類,我不知道如何觸發自動更改。這是可能的還是我應該使用另一個班級?更新/刷新TreeModel
2
A
回答
3
您必須使用模型的偵聽器集合,並且當您的清爽線程評論一些更改時,您必須將事件觸發給它們。我不認爲PropertyChangeSupport
會在這裏幫助你很多,因爲樹模型的數據不是以Java bean屬性的形式存在的,而且你不想觸發PropertyChangeEvents。
TreeModel中實現我做最後一點,我做了這些方法(與德國評論:-P)
/**
* Benachrichtigt die Listener, dass die Struktur unterhalb
* eines bestimmten Knotens komplett geändert wurde.
*/
private void fireStructureChanged(TreePath path) {
TreeModelEvent event = new TreeModelEvent(this, path);
for(TreeModelListener lis : listeners) {
lis.treeStructureChanged(event);
}
}
/**
* Benachrichtigt die Listener, dass unterhalb eines Knotens
* einige Knoten entfernt wurden.
*/
private void fireNodesRemoved(TreePath parentPath,
int[] indices, Object[] nodes) {
TreeModelEvent event =
new TreeModelEvent(this, parentPath, indices, nodes);
for(TreeModelListener lis : listeners) {
lis.treeNodesRemoved(event);
}
}
/**
* Benachrichtigt die Listener, dass ein bestimmter Knoten
* entfernt wurde.
*/
private void fireNodeRemoved(TreePath path, int index, Object node) {
fireNodesRemoved(path, new int[]{index}, new Object[]{node});
}
/**
* Benachrichtigt die Listener, dass sich das Aussehen einiger
* Unterknoten eines Knotens geändert hat.
*/
private void fireNodesChanged(TreePath parentPath,
int[] indices, Object[] nodes) {
TreeModelEvent event =
new TreeModelEvent(this, parentPath, indices, nodes);
for(TreeModelListener lis : listeners) {
lis.treeNodesChanged(event);
}
}
/**
* Benachrichtigt die Listener, dass sich das Aussehen eines Knotens
* geändert hat.
*
* @param parentPath der Pfad des Elternknotens des relevanten Knotens.
* @param index der Index des Knotens unterhalb des Elternknotens.
* Falls < 0, werden die Listener nicht benachrichtigt.
* @param node der Subknoten.
*/
private void fireNodeChanged(TreePath parentPath,
int index, Object node) {
if(index >= 0) {
fireNodesChanged(parentPath, new int[]{index}, new Object[]{node});
}
}
/**
* Benachrichtigt die Listener, dass unterhalb eines Knotens einige
* Knoten eingefügt wurden.
*/
private void fireNodesInserted(TreePath parentPath,
int[] indices, Object[] subNodes) {
TreeModelEvent event =
new TreeModelEvent(this, parentPath, indices, subNodes);
for(TreeModelListener lis : listeners) {
lis.treeNodesInserted(event);
}
}
/**
* Benachrichtigt die Listener, dass ein Knoten eingefügt wurde.
*/
private void fireNodeInserted(TreePath parentPath,
int index, Object node) {
fireNodesInserted(parentPath, new int[]{index}, new Object[]{node});
}
然後從不管什麼時候改變了正確的方法是調用模型的其他部分。
如果您想簡化一下,您可以簡單地始終使用根節點激發一個treeStructureChanged
事件,這會導致整個樹重新加載。對於更好的事件,你需要看看事實上發生了什麼變化,然後解決這個問題。
2
不能完全確定,你的意思是「用一個PropertyChangeListener刷新樹」,但與保羅認同:一個PropertyChangeListener不有益通知的TreeModel聽衆(其中包括JTree的)。
這是TreeModel的任何實現通過適當的TreeModelEvents通知其偵聽器的內在責任。如果它監聽包含節點的變化(可能觸發f.i. PropertyChangeEvents),那麼它必須將它們轉換爲TreeModelEvents。
僞代碼片段:
public class MyTreeModel implements TreeModel {
PropertyChangeListener nodeListener;
// custom method to insert a node
public void addNodeTo(MyBean child, MyBean parent) {
// ... internal logic to add the new node
fireChildAdded(getPathToRoot(parent), child)
// add a PropertyChangeListener to new node so the model
// can comply to its notification contract
child.addPropertyChangeListener(getPropertyChangeListener();
}
protected void nodePropertyChanged(MyBean bean) {
firePathChanged(getPathToRoot(bean));
}
protected TreePath getPathToRoot(MyBean bean) {
// construct and return a treePath to the root
}
protected PropertyChangeListener getPropertyChangeListener() {
if (nodeListener == null) {
nodeListener = new PropertyChangeChangeListener() {
public void propertyChanged(...) {
nodeChanged((MyBean) e.getSource();
}
);
}
}
構建真實事件是一個有點混亂(且不良記錄),這就是爲什麼SwingX has a helper class TreeModelSupport來簡化這一任務。
相關問題
- 1. 刷卡刷新以更新數據
- 2. 刷新dataTable的表更新
- 3. 刷新更新面板c#
- 4. 更新DataProvider時DataGrid刷新
- 5. 刷新更新面板
- 6. 刷新更新包在R
- 7. 網頁刷新,mysql更新
- 8. HTML5 URL更新無刷新
- 9. 刷新或更新部分
- 10. Android更新/刷新TextView
- 11. 更新後刷新JTable
- 12. ASP.NET刷新更新面板
- 13. 更新或刷新Word ContentControls
- 14. Django的:無刷新更新
- 15. 更新UITableViewCell無刷新
- 16. WPF:更新後刷新UserControls
- 17. 更新Codeigniter形式 - 刷新
- 18. 刷新刷新
- 19. 刷新DIV當有新的更新
- 20. WPF:更新/刷新/重新綁定ItemSource?
- 21. 反應本地熱重新刷新刷新,但不更新更改
- 22. 刷新VS刷新
- 23. 刷新不刷新
- 24. 更新Wicket 6.0刷新行的問題刷新視圖示例
- 25. 如何在移動子樹後更新TreeModel
- 26. 如何從外部函數更新Gtk :: TreeModel :: Row
- 27. SqlDependency和表更新不刷新DataContext
- 28. 你如何處理更新刷新率?
- 29. 刷新後更新按鈕狀態wpf
- 30. AngularJS不刷新ngRepeat更新數組時