【问题标题】:Updating JxTreeTable when model changes模型更改时更新 JxTreeTable
【发布时间】:2012-03-27 20:31:48
【问题描述】:

当底层模型发生变化时,我无法找出重绘 JxTreeTable 的最佳方法。

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

之后,给定一个节点,如何在桌子上触发重绘/更改事件来强制它重绘。欢迎提供线索,对细节的轻描淡写表示歉意,我没有太多可以通过代码展示的内容。

【问题讨论】:

  • TreeTableModel 是一个 TreeModel,因此要解决通知问题,首先要针对普通的 J/X/Tree 测试您的自定义实现:如果它的行为(又名:更新)正确,那么它的可能性很高在 JXTreeTable 中也是如此

标签: java swing redraw swingx jxtreetable


【解决方案1】:

我最终这样做了:

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

代码在我的模型中调用,该模型扩展为 DefaultTreeTableModel。

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

【讨论】:

    【解决方案2】:

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

    Swing tutorial 中有一个带有标准 JTree 的示例

    【讨论】:

      【解决方案3】:

      你可以试试这个:

      yourJxTreeTable.getTreeTableModel.fireTableRowsUpdated(firstRow, lastRow)
      

      我认为它会起作用。

      【讨论】:

      • 不幸的是,你想错了 ;-) a) 通知 总是 是模型本身的责任,永远不要从外部代码调用任何 fireXX b) 没有方法 fireTableRowsUpdated TreeTableModel(它是一个TreeModel)
      • 嗯,好吧...我看到这是一个 TreeTableModel:download.java.net/javadesktop/swinglabs/releases/0.8/docs/api/… 我已经遇到了这种问题,即使它不是一个干净的代码,fireXX 操作也能正常工作。
      • 好的,如果我的 JTree 没有重新绘制,我该怎么办?解释我:)
      • 与往常一样的程序:确保您的模型符合其通知合同
      【解决方案4】:

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

      modelSupport.fireNewRoot(); 
      

      【讨论】:

        【解决方案5】:

        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();
        }
        

        就是这样! :)

        【讨论】:

          【解决方案6】:

          简单,调用JXTreeTable.updateUI();

          【讨论】:

          • 用户代码不应该调用组件的 updateUI 方法
          猜你喜欢
          • 2018-06-30
          • 1970-01-01
          • 2014-02-07
          • 1970-01-01
          • 1970-01-01
          • 2012-06-22
          • 2014-04-14
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多