VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 931|回复: 3

悬浮菜单及树问题

[复制链接]

1

主题

2

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-3-19 16:30:01 | 显示全部楼层 |阅读模式
问题要求如下:在树上点出悬浮菜单,选择"增加子节点",生成100个节点,要求100个节点在生成过程中动态地显示到树中,但现在情况是:1,只有所有节点生成后,才一起显示出来.  2,在所有节点没有生成时,悬浮菜单一直保持,仅当所有节点生成后,悬浮菜单才消失.
回复

使用道具 举报

0

主题

5

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
发表于 2020-6-24 22:30:01 | 显示全部楼层
典型的Swing/AWT Event Dispatch Thread长时间占用问题。
处理事件的方法在没有返回以前,AWT的EventQueue所有后续事件,包括PAINT事件是被阻塞的,因此你的界面是不能刷新的,虽然你已经更新了树的model。
在Swing/AWT包括SWT编程中要注意,对于长时间大工作量任务的处理要注意两个问题:
* Time-consuming tasks should not be run on the Event Dispatch Thread. Otherwise the application becomes unresponsive.
消耗事件的任务不要放在Event Dispatch Thread上运行。否则界面就会僵死。
* Swing components should be accessed on the Event Dispatch Thread only.
Swing组件的访问只能在Event Dispatch Thread来完成。
在JDK 5和JDK 6中引入了一个新的类叫SwingWorker,是专门解决这种问题。详细的内容可以参见java API帮助:
http://download.java.net/jdk/jdk-api-localizations/jdk-api-zh-cn/builds/latest/html/zh_CN/api/javax/swing/SwingWorker.html
回复

使用道具 举报

0

主题

5

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
发表于 2020-6-25 18:15:01 | 显示全部楼层
给你个样例代码:
//这个方法是悬浮菜单的事件处理方法
private void actionPerform(ActionEvent e){
MySwingWorker msw=new MySwingWorker(yourTree);
   msw.execute();
}
//下面是MySwingWorker的实现:
public class MySwingWorker extends SwingWorker{
    private JTree tree;
    public MySwingWorker(JTree tree) {
        this.tree=tree;
    }
    protected Object doInBackground() throws Exception {
        for(int i=0;i<100;i++){
            //生成一个节点并添加到树上....
            //...;
            //通知EDT线程刷新树
            publish();
        }
        return null;
    }
    protected void process(List<Object> chunks) {
        tree.repaint();
    }
}
回复

使用道具 举报

1

主题

2

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
 楼主| 发表于 2020-7-28 20:45:01 | 显示全部楼层
我另外用一个线程来处理了.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

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