声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 1857|回复: 0

[GUI界面] (原创)关于Matlab中uitree添加/删除节点时出现的ThreadException

[复制链接]
发表于 2009-8-27 14:21 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
上网查了很久,中文网站没有这方面的东西,只是在国外网站查到了类似的问题。今天终于解决这个问题了,写点东西,我相信以后会有人遇到类似的问题,希望对大家有帮助。写的很不专业,别拍我。


我的目标:创建uitree,并向其中添加节点。


我的问题:在利用treeModel.insertNodeIntotreeModel.removeNodeFromParent方法时总是抛出ArrayIndexOutOfBoundsException的ThreadException ,利用try-catch-end也不能避免。

只是在国外网站查到了类似的问题。发现问题是出在线程。对于我这么个非典型程序员,线程的问题确实难住了我。再加上matlabjava混合编程,更不知从何入手解决了。大家可以先参看下面国外的几篇文档:
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.insertNodeIntotreeModel.removeNodeFromParent对节点操作的时候,线程会出现混乱。一方面tree列表的显示要更新,另一方面要tree内在的内容要更新,这时就会出现问题。


解决的方法:添加和删除节点不使用insertNodeIntoremoveNodeFromParent这两个函数,而是使用uitreenodeaddremove函数!

先说说实现一个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

查看全部评分

回复
分享到:

使用道具 举报

您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-5-18 06:09 , Processed in 0.062403 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表