2013-06-04 3 views
0

내 대화 상자 클래스에서 내 TableViewer를 만들면 어떻게됩니까? 나는 ListChangeListener를 추가하고있다. 이 리스너는 내 데이터 모델 클래스의 ObservableList를 수신합니다.SWT - 대화 상자에서 ListChangeListener 제거 닫기

이 클래스는 대화 상자 클래스의 createTableViewer 메서드입니다.

private void createTableViewer(Composite parent) { 
    viewer = new AplotDataTableViewer(parent, SWT.BORDER|SWT.V_SCROLL|SWT.FULL_SELECTION); 
    IObservableList iob = AplotDataModel.getInstance().getObservableList(); 
    viewer.setInput(iob); 
    iob.addListChangeListener(new IListChangeListener() { 
    @Override 
    public void handleListChange(ListChangeEvent event) { 
     updateTableViewer(); 
    } 
    }); 
} 

무슨 일이 일어나고 있는지. 사용자가 윈도우 닫기 버튼 (빨간색 X)을 사용하여 대화 상자를 닫을 때. 위젯을 모두 삭제하고 창을 닫는 것입니다. 대화 상자가 열릴 때. ListChangeListener가 updateTableViewer를 찾고 있지만 업데이트의 위젯이 이미 삭제되었습니다.

지금 대화 상자를 닫는 방법에는 두 가지가 있습니다. 1. 빨간색 X - 아마도 Window.close()를 할 것입니다. 2. 양식의 내 닫기 버튼.

어느 것이 okPressed를 사용하고 쉘을 숨기고 있는지.

대화 상자를 닫는 두 가지 방법을 모두 갖고 싶습니다.

  1. 셸 및 handleEvent 메서드에 리스너를 추가 할 수 있습니까? okPressed 메소드를 호출 했습니까?

    getShell().addListener(SWT.Close, new Listener() { 
        @Override 
        public void handleEvent(Event e) { 
         okPressed(); 
        } 
        }); 
    
  2. 대신 Window.Close를 사용해야합니까?

  3. 내가 대신 ok_ID

    @Override 보호 무효 createButtonsForButtonBar (복합 부모) { createButton의 Close_ID를 사용해야합니다 (부모, IDialogConstants.CLOSE_ID, "닫기 Aplot" TRUE); }

    @Override getShell(). }

  4. 내 활성 ListChangeListener를 가져와 제거 할 수있는 방법이 있습니까?

    protected void closePressed() { AplotDataModel.getInstance(). getObservableList(). removeListChangeListener (this); }

  5. 활성 수신기를 얻는 방법을 모르겠습니까?

양식의 Windows 닫기 단추 (빨간색 X) 또는 닫기 단추를 사용하여 대화 상자를 닫으 려합니다. 가능하다면 두 작업 모두 동일한 코드를 사용하여 IObservableList에서 활성 수신기를 제거하고 대화 상자를 닫으십시오.

답변

3

DisposeListener을 창에 추가 했습니까? dispose listener는 사용자가 컨트롤에 설정 한 모든 이벤트 리스너를 등록 취소 할 수 있습니다. 이것은 빨간색 X에서 또는 메서드에서 shell.close()을 호출하여 창을 닫는 방법에 관계없이 발생합니다.예를 들어

:

private void createTableViewer(Composite parent) { 
    viewer = new AplotDataTableViewer(parent, SWT.BORDER|SWT.V_SCROLL|SWT.FULL_SELECTION); 
    final IObservableList iob = AplotDataModel.getInstance().getObservableList(); 
    viewer.setInput(iob); 

    final IListChangeListener listener = new IListChangeListener() { 
    @Override 
    public void handleListChange(ListChangeEvent event) { 
     updateTableViewer(); 
    } 
    }; 

    iob.addListChangeListener(listener); 

    getShell().addDisposeListener(
    new DisposeListener() { 
     @Override public void widgetDisposed(DisposeEvent e) { 
      iob.removeListChangeListener(listener); 
     } 
    }); 
} 
+0

방법, 그래서 그것을 제거 할 수 있습니다 내가 청취자를받을 수 있나요? – jkteater

+1

예를 들어 업데이트되었습니다. 기본적으로 제거하려는 리스너에 대한 참조를 유지해야합니다. –

관련 문제