2013-04-16 7 views
1

오늘 내 문제는 JFace TreeViewerComposite에서 간단한 경합과 관련됩니다. 최소 폭을 적용하기 위해 내 트리의 열에 ControlListener을 첨부하려고합니다. 이렇게하려면 열이 크기가 조정될 때마다보고 있는데 새 너비가 너무 작 으면 최소값을 지정합니다.청취자가 스스로를 트리거하지 못하도록

이것은 GUI 문제이지만 실제로는 수정 리스너가있는 모든 Java 환경에서 발생할 수있는 문제입니다. 나는 아마도 당신 중에 자바 괴짜들이 재미 있을지도 모른다고 생각했습니다. 작동

public static void getSizeControlListener(final TreeColumn column, final int minSize) { 
     column.addControlListener(new ControlListener() { 
      @Override 
      public void controlMoved(ControlEvent e) {} 

      @Override 
      public void controlResized(ControlEvent e) { 
       if(column.getWidth()<minSize) { 
        column.setWidth(minSize); 
       } 
      } 
    }); 

하나의 해결책은 필요한 경우 중첩 된 호출은 즉시 종료를 참조 할 수 있다는 입구에 설정됩니다 플래그를 추가하는 것입니다. 그것은 효과가 있지만 더럽고 추악합니다.

public static void getSizeControlListener(final TreeColumn column, final int minSize) { 
     column.addControlListener(new ControlListener() { 

      private boolean isRunning; 

      @Override 
      public void controlMoved(ControlEvent e) {} 

      @Override 
      public void controlResized(ControlEvent e) { 
       if(isRunning) 
        return; 
       isRunning = true; 
       if(column.getWidth()<minSize) { 
        column.setWidth(minSize); 
       } 
       isRunning = false 
      } 
    }); 

답변

1

귀하의 솔루션 코드 아래에 넣어해야한다고 생각하는 것은 우리가 정기적으로 이 패턴을 사용 알림 폭포을 방지 완전히 괜찮습니다.
이러한 연쇄가 발생할 때의 한 예가 MVC의 모델 뷰 상태를 동기화 할 때입니다. 이러한 플래그를 사용하면 양방향 동기화를 통해 캐스케이드없는 단방향 업데이트를 실현할 수 있습니다.

if (updating) { 
    return; 
} 
try { 
    updating=true; 

    // do stuff 

} finally { 
    updating=false; 
} 
:

구현의 유일한 차이는 우리가 (예외가 발생도 때) 확인 플래그가 항상 재설정 할 try..finally를 사용한다는 것입니다

0

나는 당신이 플래그 org.eclipse.swt.widgets.Display.asyncExec(Runnable)

column.setWidth(minSize); 
관련 문제