(原创)关于Matlab中uitree添加/删除节点时出现的ThreadException
上网查了很久,中文网站没有这方面的东西,只是在国外网站查到了类似的问题。今天终于解决这个问题了,写点东西,我相信以后会有人遇到类似的问题,希望对大家有帮助。写的很不专业,别拍我。我的目标:创建uitree,并向其中添加节点。
我的问题:在利用treeModel.insertNodeInto和treeModel.removeNodeFromParent方法时总是抛出ArrayIndexOutOfBoundsException的ThreadException ,利用try-catch-end也不能避免。
只是在国外网站查到了类似的问题。发现问题是出在线程。对于我这么个非典型程序员,线程的问题确实难住了我。再加上matlab和java混合编程,更不知从何入手解决了。大家可以先参看下面国外的几篇文档:
http://stackoverflow.com/questions/466599/jtree-gives-arrayindexoutofboundsexception
http://www.mathworks.com/matlabcentral/newsreader/view_thread/156388
http://www.mathworks.com/support/solutions/data/1-18Y68.html?solution=1-18Y68
问题的原因:我只能说个大概。matlab中利用treeModel.insertNodeInto和treeModel.removeNodeFromParent对节点操作的时候,线程会出现混乱。一方面tree列表的显示要更新,另一方面要tree内在的内容要更新,这时就会出现问题。
解决的方法:添加和删除节点不使用insertNodeInto和removeNodeFromParent这两个函数,而是使用uitreenode的add和remove函数!
先说说实现一个tree基本有两种方式:
1、
% 根节点
rootNode = uitreenode('root', 'File List', [], 0);
% treeModel
treeModel = DefaultTreeModel( rootNode );
% 创建tree
tree = uitree;
tree.setModel( treeModel ); % 显示tree
jtree = tree.getTree; % 得到jtree
......
2、
tree=uitree(hMainfig);
% 创建根节点
rootnode=uitreenode('rootnode', 'xxx', [], 0);
% 添加根节点
tree.setRoot(rootnode);
treeModel=tree.getModel;
jtree = tree.getTree; % 得到jtree
......
添加和删除节点的方法也有两种:
1、
treeModel.insertNodeInto(childnode, parentnode, parentnode.getChildCount());
treeModel.removeNodeFromParent(childnode);
2、
parentnode.add(childnode)
parentnode.remove(childnode)
利用第一种添加、删除节点的方法会出现线程异常!因为这种操作既会修改tree内在的内容有会更新tree的显示。而第二种方法则不会!所以我解决异常的方法是:
% 创建根节点
rootNode = UITreeNode('root', 'File List', [], 0);
% 在tree显示之前添加子节点!!!!!!!
cNode1 = UITreeNode('xx', 'File a', [], 0);
rootNode.add(cNode);
cNode2 = UITreeNode('xx', 'File b', [], 0);
rootNode.add(cNode);
......
% 创建treeModel
treeModel = DefaultTreeModel( rootNode );
% 创建tree
tree = uitree;
% 所有节点已经添加完成了,这时候显示tree!!
tree.setModel( treeModel ); % 显示tree
jtree = tree.getTree; % 得到jtree
每次更新tree可以删除tree,添加完所有节点,然后利用上面的方法重新建立一个!而不是对现有的tree进行操作。这种方法的效果挺好的,个人感觉在显示性能上比对现有tree操作要好。
页:
[1]