2015-09-16 2 views
2

У меня есть элемент управления, который должен реагировать на некоторые виды событий и поэтому добавляет себя в список слушателей в конструкторе. Конечно, он также должен удалиться, но в то время как Swing и RCP имеют методы dispose(), я не могу найти их в JavaFx.Dispose Метод управления JavaFX

public class MyTable extends TableView implements MyListener { 

public MyTable() { 
    Events.addListener(this); 
} 

public disposeOrSomething() { 
    Events.removeListener(this); 
} 

// actual implementation of MyListener 

} 

Не подвешивайте на статике класс Events, подумал. Для меня не имеет значения, добавляет ли элемент что-то статическое или нет. Важно: есть две части приложения, которые не связаны, за исключением общей системы событий. Поэтому, когда слушающая часть исчезает (например, окно закрывается), конечно, слушатель должен быть удален.

До тех пор пока вы не узнаете, когда слушатель был непосредственно подключен к жизненному циклу элемента управления, его зарегистрировали. Но теперь в JavaFX, который не будет работать, и из-за слабо связанных файлов FXML я не вижу никого другого, у кого есть необходимая информация (элемент управления и «событие закрытия окна»).

Итак, что такое хороший способ очистки после контроля, когда они больше не используются?

+0

AFAIK, нет встроенного 'распоряжаться()' (или эквивалент) метод в JavaFX – Spotted

+0

В Swing, на что «распоряжаться» -метом вы имеете в виду? – Puce

+0

@Puce Я не вижу, как это добавляет вопрос, но все окна имеют метод 'dispose()'. –

ответ

0

Как уже говорилось ранее, я не рекомендую использовать глобальную шину событий и, как было предложено @Puce, не регистрировать слушателей ничем иным, кроме инкапсулированных объектов.

В любом случае, это способ автоматической подписки на события только при показе определенного Node (т. Е. Автоматически отменить подписку при удалении узла из сцены или закрытии окна). Это решение использует ReactFX, а именно вспомогательный метод EventStream#conditionOnShowing.

Поскольку вы не предоставили подпись MyListener, я буду считать эту подпись:

@FunctionalInterface 
interface MyListener { 
    void handle(MyEvent event); 
} 

import org.reactfx.EventStream; 
import org.reactfx.EventStreamBase; 
import org.reactfx.Subscription; 

public class MyTable extends TableView { 
    public MyTable() { 

     // Since you are using some custom event dispatching mechanism, 
     // the first step is to convert that into a ReactFX EventStream. 
     EventStream<MyEvent> events = new EventStreamBase<MyEvent>() { 
      @Override protected Subscription observeInputs() { 
       MyListener l = event -> notifyObservers(event); 
       Events.addListener(l); 
       return() -> Events.removeListener(l); 
      } 
     }; 

     // Now the interesting part: events will not be observed whenever 
     // this MyTable is not part of a showing Window. 
     events.conditionOnShowing(this).subscribe(event -> this.handleEvent(Event)); 
    } 

    private void handleEvent(MyEvent) { 
     /* ... */ 
    } 
} 
+0

'Я рекомендую не использовать глобальную шину событий' - Почему? –

+0

@RobertHarvey, потому что это затрудняет рассуждение о потоке данных. –

+0

Это все еще немного расплывчато. Если вы собираетесь сделать столь радикальное заявление, хорошо, если вы добавите некоторые ощутимые обоснования. –

0

Я рекомендую использовать шаблон посредника и слушать только события собственных дочерних элементов управления.

+0

Это не работает, если есть две отдельные части приложения, которые необходимо обменивать. –

+0

'Я рекомендую использовать шаблон посредника и только слушать события собственных дочерних элементов управления - Почему? –

Смежные вопросы