2012-03-27 96 views
1

我在解决底层模型更改时重绘JxTreeTable的最佳方法时遇到问题。模型更改时更新JxTreeTable

对于表中的每个节点,我都有一个对应的模型对象,所以如果模型发生变化,我可以得到节点。

此后,给定一个节点,如何触发表上的重绘/更改事件以强制重绘。欢迎提供线索,对细节信息表示歉意,我没有太多需要通过代码来展示。

+0

TreeTableModel是一个TreeModel,因此为了解决通知问题,首先测试您的自定义实现对一个普通的J/X/Tree:如果该行为(又名:更新)正确,它在JXTreeTable中的机会很高以及 – kleopatra 2012-03-28 08:14:36

回答

4

我落得这样做:

  TreeTableNode parent = node.getParent(); 
      modelSupport.firePathChanged(new TreePath(getPathToRoot(parent))); 

的代码被称为在我的模型,它扩展,DefaultTreeTableModel。

node是包含已更改模型的AbstractMutableTreeTableNode。

3

如果您的模型触发了正确的事件,它将自动工作,类似于标准JTreeJTable

的例子有标准JTree出现在Swing tutorial

1

你可以试试这个:

yourJxTreeTable.getTreeTableModel.fireTableRowsUpdated(firstRow, lastRow) 

我认为它会工作。

+1

不幸的是,你认为错误;-) a)通知_always_是模型本身的责任,从不从外部代码调用任何fireXX b)没有方法fireTableRowsUpdated在TreeTableModel中(它是 - TreeModel) – kleopatra 2012-03-28 08:08:17

+0

Mhh,ok ... 我看到它是这样的一个TreeTableModel:http://download.java.net/javadesktop/swinglabs/releases/0。8 /文档/ API /组织/ JDesktop中/ swingx/JXTreeTable.html 我已经有这样那样的问题和fireXX行动工作得很好,即使它不是一个干净的代码。 – 2012-03-28 09:29:48

+0

它不仅是不干净,而且是错误的。 – kleopatra 2012-03-28 11:13:01

1

简单,调用JXTreeTable.updateUI();

0

DefaultTreeTableModel包含modelSupport可用于触发事件的字段。对于您的情况,您可以在您的模型中使用以下一段代码:

modelSupport.fireNewRoot(); 
0

updateUI()方法也适用于我,也!

我的模型实现TreeTableModel,并在其中有一个TreeModelSupport对象。

当我添加/删除节点,我火modelSupport.fireChildXXX方法:

public void insertNodeInto(MutableTreeTableNode newChild, MutableTreeTableNode parent, int index) { 
    modelSupport.fireChildAdded(new TreePath(getPathToRoot(parent)), index, newChild); 
} 

我加TreeModelListener到modelSupport对象和覆盖treeStructureChanged方法:

 public void treeStructureChanged(TreeModelEvent e) { 
      m.notifyChanges(); 
     } 

我notifyChanges方法喜欢这样的:

public void notifyChanges() 
{ 
    treeTable.updateUI(); 
} 

就这样! :)