Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 打开时调用JFace ComboViewer setComparator()_Java_Swt_Listener_Jface - Fatal编程技术网

Java 打开时调用JFace ComboViewer setComparator()

Java 打开时调用JFace ComboViewer setComparator(),java,swt,listener,jface,Java,Swt,Listener,Jface,我被SWT问题困住了。我想将ViewerComparator类的创建推迟到用户真正想要从ComboViewer中选择一个项目的时候。在我的用例中,比较器是一个非常复杂的野兽,它使用了大量的资源。用户通常不需要实际打开CombiViewer,因此我认为可以通过将比较器的创建推迟到真正需要的时候来节省计算时间 以下是我尝试过的: comboViewer1.addOpenListener(new IOpenListener(){ @Override public void open(

我被SWT问题困住了。我想将ViewerComparator类的创建推迟到用户真正想要从ComboViewer中选择一个项目的时候。在我的用例中,比较器是一个非常复杂的野兽,它使用了大量的资源。用户通常不需要实际打开CombiViewer,因此我认为可以通过将比较器的创建推迟到真正需要的时候来节省计算时间

以下是我尝试过的:

comboViewer1.addOpenListener(new IOpenListener(){

    @Override
    public void open(OpenEvent event) {

        if (comboViewer1.getComparator() == null){
            comboViewer1.setComparator(new ViewerComp(transientModelThing.getComRef()));
        }
    }
});
我不太熟悉SWT和JFace。但是在调试器中,我看到这个open方法从未被调用。我希望在用户尝试折叠组合框时调用它


不知道听者为什么不工作?我注册的postSelectionListener与完美运行的方式基本相同。comboViewer1和transientModelThing是公共全局变量。ViewerComp是我实现这个复杂比较器的私有类

根据回答自己的问题(如果问题得到解决)的良好传统,我在这里提出了我的解决方案:

comboViewer1.getControl().addListener(SWT.MouseEnter, new Listener(){

    @Override
    public void handleEvent(Event event) {

        if (comboViewer1.getComparator() == null){
            comboViewer1.setComparator(new ViewerComp(transientModelThing.getComRef()));
        }
    }
});
我现在使用SWT.MouseEnter事件。这当然不是我想要的,但已经足够近了


@greg-449 Thx用于输入

因此,不调用的是open方法,而不仅仅是未执行的if部分?当双击或单次单击列表中的某个条目时,根据打开策略,会调用IOPNenstener。当组合查看器打开下拉列表时不会调用它。@greg-449,THX那么我需要什么类型的侦听器呢?在comboviewer展开之前,应该有一个钩子可以使用。没有具体的事件,这个问题有一些建议:@Baz,是的,正确。公开赛不叫公开赛。看来我用错了听筒,不是吗?MouseDown是更好的解决方案?我两个都试过了。MouseDown不适用于此目的。您使用的是哪个版本的SWT?据我所知,它应该是有效的。