【问题标题】:How to add add a TreeModelListener to the NetBeans Outline?如何将 TreeModelListener 添加到 NetBeans 大纲?
【发布时间】:2010-01-18 22:46:46
【问题描述】:

我正在使用 NetBeans Outline 模型创建 TreeTable,该技术描述为 here

一切看起来都很干净,我现在想在我的模型中添加一个 TreeModelListener 来监听模型中的变化:

Outline outline = new Outline();
MyNode root = new MyNode("data", 0);
//...
TreeModel treeMdl = new MyTreeModel(root);
OutlineModel mdl = 
DefaultOutlineModel.createOutlineModel(treeMdl, new MyRowModel(), true, "Data");
mdl.addTreeModelListener(new MyTreeModelListener());
outline.setModel(mdl);
//...

public class MyTreeModelListener implements TreeModelListener {
    public void treeNodesChanged(TreeModelEvent e) {
        System.out.println("Something happend");

    }

    public void treeNodesInserted(TreeModelEvent e) {
        // TODO Auto-generated method stub

    }

    public void treeNodesRemoved(TreeModelEvent e) {
        // TODO Auto-generated method stub

    }

    public void treeStructureChanged(TreeModelEvent e) {
        // TODO Auto-generated method stub

    }

}

一切都按预期工作,但我的问题如下,我编写了自己的 TreeModel 类,这显然意味着我必须编写自己的 addTreeModelListener 方法,但我该怎么做呢?

public class MyTreeModel implements TreeModel {

    private MyNode root;

    public MyTreeModel(SdbNode root) {
        this.root = root;
    }

    @Override
    public void addTreeModelListener(TreeModelListener l) {
        //TODO:
    }

    //...
}

【问题讨论】:

  • 您能否发布一下您是如何实现从 NetBeans 大纲中删除节点的?

标签: java swing netbeans


【解决方案1】:

javax.swing.event.EventListenerList 将处理大部分繁重的工作。 addremovegetListeners 方法的类参数允许您将所有侦听器存储在一个列表中,然后仅提取所需类型的子集。

注意:class参数是接口的类,而不是实现的类。

基本上是这样的:

    private EventListenerList listeners = null;

    public void addTreeModelListener(TreeModelListener l) {
        if (l == null)
            return;
        if (listeners == null)
            listeners = new EventListenerList();
        listeners.add(TreeModelListener.class, l);
    }

    public void removeTreeModelListener(TreeModelListener l) {
        if (l == null)
            return;
        if (listeners == null)
            return;
        listeners.remove(TreeModelListener.class, l);
    }

    private void fireTreeStructureChanged(TreeModelEvent e) {
        if (e == null)
            return;
        if (listeners == null)
            return;
        TreeModelListener[] ll = listeners.getListeners(TreeModelListener.class);
        for(int i = 0; i < ll.length; i++)
            ll.treeStructureChanged(e);
    }

如果您支持其余的模型通知,则需要在最后一个调用 treeNodesInsertedtreeNodesRemovedtreeNodesChanged 的方法上实现变体

【讨论】:

    猜你喜欢
    • 2012-11-22
    • 1970-01-01
    • 2013-08-18
    • 2011-11-29
    • 1970-01-01
    • 1970-01-01
    • 2019-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多