Время жизни объекта

Рейтинг: 1Ответов: 1Опубликовано: 04.07.2011

Как можно убедиться, что объект еще существует? Как сделать так, чтоб объект существовал в определенный момент? Есть такой код:

public void onMouseDown(MouseDownEvent event) {
    final MouseDownEvent e = event;
    timer = new Timer() {           
        @Override
        public void run() {
             int x = e.getX();
             int y = e.getY();                
        }             
    };
    timer.schedule(timeDelay);
}

В итоге, на вызове int x = e.getX(); падает с ошибкой.

(TypeError): Cannot read property 'clientX' of null arguments: clientX, type: non_object_property_load

Как правильно сделать, чтобы после срабатывания таймера получить доступ ко всем полям объекта MouseDownEvent?

Возможно ликак скопировать объект (подобие clone)?

Пробовал сделать подкласс и переопределить некоторые поля, не помогло. Видимо, надо, либо все переопределять, либо искать другой путь.

Ответы

▲ 3

Проверка на e != null здесь не в тему. Если ставить условие, то e.isLive().

Использование GwtEvent в качестве параметра в библиотеке может быть либо нарушением контракта GWT, либо сознательным запретом на вызов метода из callback, timer, scheduler, и др. Т.к. об этом явно сказано в документации. В общиx случаяx, если xотят сообщить, что событие можно передавать в качестве параметра в любой момент, используют NativeEvent, а не GwtEvent. Специально для этого создан метод createMouseDownEvent в Document. А также NativeEvent можно получить из GwtEvent, обратное неверно.

Если такой параметр в библиотеке по ошибке автора, то можно попробовать отнаследоваться от MouseDownEvent, если это возможно (он вроде как не final), для того, чтобы создавать его. Мы сможем создать public-конструктор и вызывать через super() protected-конструктор основного класса. И переопределить методы get-что-то-там на те значения, которые пришли с событием до выполнения таймера. И использовать как обертку. Не факт, что это возможно. Проверить сейчас не могу.