Вызовите JFace ComboViewer setComparator() при открытии

Я застрял с проблемой SWT. Я хочу отложить создание класса ViewerComparator до того момента, когда пользователь на самом деле хочет выбрать элемент из ComboViewer. В моем случае Comparator - довольно сложный зверь, который использует много ресурсов. Обычно пользователю не нужно открывать CombiViewer, поэтому я подумал, что смогу сэкономить вычислительное время, отложив создание Comparator до того момента, когда он действительно понадобится.

Вот что я попробовал:

comboViewer1.addOpenListener(new IOpenListener(){

    @Override
    public void open(OpenEvent event) {

        if (comboViewer1.getComparator() == null){
            comboViewer1.setComparator(new ViewerComp(transientModelThing.getComRef()));
        }
    }
});

Я не очень знаком с SWT и JFace. Но в отладчике я вижу, что этот открытый метод НИКОГДА не вызывается. Я ожидал, что он будет вызван, когда пользователь попытается свернуть поле со списком.

Нет идей, почему слушатель не работает? PostSelectionListener, который я регистрирую почти так же, функционирует безупречно. comboViewer1 и transientModelThing являются общедоступными глобальными переменными. ViewerComp - мой частный класс, который реализует этот сложный компаратор.

1 ответ

В доброй традиции отвечать на собственные вопросы, если они решены, я поставил здесь свое решение:

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 Спасибо за ввод!

Другие вопросы по тегам