Java 删除选择后的SWT选择事件

Java 删除选择后的SWT选择事件,java,swt,Java,Swt,我正在制作一个简单的菜单来删除树上的项目。但是,删除项目后,树不会收到选择事件,因此侦听器中的代码不会执行(完整代码中的侦听器会更新UI的一部分) 我简化了下面的代码,省略了细节。是这样的: tree.addListener (SWT.Selection, new Listener(){ public void handleEvent(Event e) { (....) } } 我也试过: tree.addSelectionListener (new Sel

我正在制作一个简单的菜单来删除树上的项目。但是,删除项目后,树不会收到选择事件,因此侦听器中的代码不会执行(完整代码中的侦听器会更新UI的一部分)

我简化了下面的代码,省略了细节。是这样的:

tree.addListener (SWT.Selection, new Listener(){
     public void handleEvent(Event e) {
     (....)
    }
}
我也试过:

    tree.addSelectionListener (new SelectionListener(){
        public void widgetDefaultSelected(SelectionEvent e){
            (...)
        }
        public void widgetSelected(SelectionEvent e) {
            (...)
        }
    }
在我的菜单操作(删除选择)中,有以下内容:

    TreeItem [] selected = tree.getSelection();
    tree.deselectAll();
    if (selected.length > 0)
    {
      for( TreeItem i : selected){
          i.dispose();
      }
    }
删除选择后,“我的选择”侦听器不会启动。如果我使用ctrl+click组合取消选择所有iTen,它会触发


我该怎么办?是否有方法在删除iTen后向树触发SWT.Selection事件,或者我应该隔离侦听器中的代码以再次调用它?tree.deselectAll()不应该触发选择事件吗?

您可以通过以下方式以编程方式发送选择事件:

Event event = new Event();
event.widget = tree;
event.display = tree.getDisplay();
event.type = SWT.Selection;
tree.notifyListeners(SWT.Selection, event);

有相同的情况和发现
链接中提到,由于设计原因,以编程方式设置的setSelection可能永远不会发送此事件,因此在设置太多后始终以编程方式发送它(如果需要)

if(selected.length>0)部分不可能编译,因为您似乎没有在任何地方声明
selected
。你在对我们隐瞒什么吗?是的,我试图简化代码,以避免两者之间的混淆。很抱歉,它确实让人困惑,我会编辑的。我是否应该尝试简化代码以提问?我现在注意到我确实声明了它,TreeItem[]selected=tree.getSelection();是的,你应该尝试简化,但这是一门精细而困难的艺术:你不应该移除(或可能)与找到解决方案相关的部分。Wh00ps!我不知道我在读什么。谢谢!这解决了我的问题!但是,
树.deselectAll()不应该自动触发事件吗?
树.deselectAll禁止发送通知。所以我想这是SWT设计的一部分。嗯,SWT是蹩脚的。我查看了tree.deselectAll()的文档,它没有说明选择通知被该方法抑制。应该这样。