2017-12-20 1 views
2

보기가 삭제되면 (스테이지가 닫히고, 다른보기가 그 자리를 차지하는 등) 컨트롤러에 호출되는 메소드가 있습니까?@FXML에 대응하는 부분이 있습니까?

@FXML 
private void initialize() 

업데이트 : 그건 상대가있다,이다 나는이 일을 해요 이유는 내 응용 프로그램 PubNub에서 메시지를 수신 한 후 해당 메시지가이 컨트롤러에 전달 될 필요가 있다는 것이다 그들이 그렇게 (보기의 크기와 같은 내부 컨트롤러 정보에 의존하는지 여부에 상관없이) 행동할지 여부를 선택할 수 있습니다.

내 계획은이 컨트롤러를 글로벌 목록에 등록시키고 파괴 할 때 자체 등록을 취소하는 것이 었습니다.

+0

아니요, 그러한 방법은 없습니다. –

+0

나는 그렇게 생각하지 않는다 ... – zlakad

+1

실제 질문은 "왜 그 부분을 더 이상 사용할 수 없을 때 일부 UI 부분의 컨트롤러를 사용해야 하는가?"입니다. @ 파블로 -이 질문에 대한 답을 주시겠습니까? – zlakad

답변

2

대부분의 주석은 JavaFX에 이와 동일한 기능이 없다고 말했습니다. James_D 또한 WeakReference을 사용하여 언급 한 바 있습니다. 나는이 문제에 대한 좋은 해결책이라고 생각합니다.

public final class PubNubManager { 
    private final List<WeakReference<PubNubListener>> listeners = new ArrayList<>(); 

    // Other standard singleton stuff 

    public void informListeners(PubNubData data) { 
     listeners.stream().forEach(listenerRef -> { 
      if (listenerRef.get() != null) 
       listenerRef.get().receiveData(data); 
     }); 

     // You can remove weakreference that are no longer valid, or stop getting for data when there are no more listener. 
    } 

    public void registerListener(PubNubListener listener) { 
     if (listener != null) 
      listeners.add(new WeakReference<>(listener)); 
    } 

    // You can make one to unregister too if you want. 
} 

public interface PubNubListener { 
    void receiveData(PubNubData data); 
} 

public class ControllerA implements PubNubListener { 
    @Override 
    public void receiveData(PubNubData data) { 
     // What you need to do 
    } 
} 
+0

멋진 데모. 몇 가지 의견. 1. 이는 컨트롤러에 대한 참조를 유지하는 뷰에 의존합니다. 컨트롤러에 FXML 파일에 정의 된 하나 이상의 UI 요소가 등록 된 일종의 이벤트 리스너가있는 경우 자연스럽게 발생합니다. 컨트롤러가 통지로 UI를 업데이트하기 위해 전적으로 존재하는 경우, 범위를 너무 일찍 벗어나 알림이 중단 될 수 있습니다. 2. 반대로, 컨트롤러가 범위를 벗어난 후 약한 참조가 무효가되는시기 또는 경우에도 보장 할 수 없습니다. 따라서 메모리 누수를 방지하기 위해 작동하지만 알림은 무기한으로 계속 될 수 있습니다. –

+0

@James_D 사실. 보기 및 컨트롤러가 함께 가비지 수집되고 범위를 벗어나는대로 이상적인 세계에 있으면이 솔루션이 잘 작동하는 것처럼 보입니다. 가장 안전한 방법은 컨트롤러에서 '스테이지'에 대한 참조를 얻고 창 숨겨진 이벤트를 수신 한 다음 관리자가 수동으로 등록을 취소하는 것입니다. – Jai

+0

청취자를 등록 취소하려는 동기에 달려 있다고 생각합니다. 달리 사용되지 않는 컨트롤러 (예 : 메모리 누수를 방지하기 위해)에 불필요한 참조가 유지되지 않도록하려면이 방법으로 충분합니다. OP가 CPU 성능 측면에서 아무런 영향을 미치지 않는 코드 (알림)를 실행하는 데 관심이 있다면 필요한 작업을 수행하지 않습니다. (나는 실제로 후자가 실제로 문제가되는 것을 상상하기가 어렵다.) –

관련 문제