2011-08-27 4 views
0

제목에서 알 수 있듯이 최대화 및 최소화를 감지하기 위해 rcp 사용자 인터페이스에 리스너를 추가하려고합니다. 사실, 그건 내 진짜 목적은 아니지만 내 문제를 해결하는 방법이라고 생각합니다. 나는 가운데에 몇 가지 도형이있는 뷰를 가지고 있고 창 크기를 조정하더라도 드로잉을 정확히 중앙에 유지합니다.프로그래밍 방식으로 창 최대화/최소화 감지 ??? Eclipse RCP

public void createPartControl(final Composite parent) { 
    display = parent.getDisplay(); 
    white= display.getSystemColor(SWT.COLOR_WHITE); 
    parent.setLayout(new FillLayout(SWT.VERTICAL)); 
    final ScrolledComposite sc = new ScrolledComposite(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER); 
    sc.setExpandHorizontal(true); 
    sc.setExpandVertical(true); 
    sc.setMinHeight(100); 
    sc.setMinWidth(100); 
    sc.setSize(565, 305); 
    final Composite child = new Composite(sc,SWT.NONE); 
    child.setLayout(new FillLayout()); 
    // Set child as the scrolled content of the ScrolledComposite 
    sc.setContent(child); 
    child.setBackground(white); 
    gc = new GC(child); 
    parent.addListener (SWT.Resize, new Listener() { 
     public void handleEvent (Event e) { 
      x = child.getBounds().width/2; 
      y = child.getBounds().height/2; 
      child.addPaintListener(new PaintListener() { 
       public void paintControl(PaintEvent event) { 
        dessin(gc); // draw my shapes 
    } 
    }); 
} 

모든 나는 내가 (이 코너에) 그리기를 풀어이 경우 창을 최대화하고이를 최소화하는 경우를 제외하고 잘 어울리는 이렇게하려면, 나는 다음과 같은 수신기를 사용했다. 아무쪼록 바랍니다. 나는 올바른 생각을하고 있니?

+0

예제에서 중요한 코드가 누락 된 것 같습니다. 하지만 ... 크기 조정 이벤트가 부모에게 표시되면 자식을 크기 조정할 필요가 없습니다. –

+0

오, 네 말이 맞아. 부모가 아닌 자식에게 청취자를 추가해야 해. 고마워. – jean24

답변

1

최소화 및 최소 화 (최대화 필요는 없음)를 감지하는 두 가지 이벤트는 셸에서만 발생하는 IconifyDeiconify입니다. Shell에 대한 javadocs를 참조하십시오.

0

아이의 크기를 다시 조정할 필요가 없으므로 resize 이벤트 이동은 부모에 대한 이동을 고려하십시오.

0

무언가의 중심에 무엇인가를 유지하려면 SWT.Resize 이벤트가 필요합니다. 따라서이 질문은 XY Problem의 전형적인 경우입니다. (이 경우 OP는 이미 XY 문제 일 수 있다고 생각하는 것 같습니다.) 그러나 많은 사람들이 윈도우 최소화/최대화/복원 된 이벤트를 프로그래밍 방식으로 탐지해야하는 합법적 인 필요성으로이 질문에 도달합니다. 이유 :

종료시 응용 프로그램 창의 경계를 저장할 수 있도록하려면 최소화되거나 최대화되거나 전체 화면으로 종료 될 수 있으므로 Shell.getBounds()가 반환하는 내용을 저장할 수 없습니다. 이 경우 경계를 유지하지 않아야합니다. 유지되어야하는 것은 쉘의 "최소화 된/정상/최대화/전체 화면 상태"("자세"라고 부름)이고 마지막으로 자세가 "정상"인 쉘의 경계입니다. 기본적으로 자세가 "정상"인지, 그리고 자세가 바뀌어야 하는지를 추적해야합니다.

문제는 SWT가 "deiconified"이벤트를 발행 할 때 아직 셸의 경계를 계산하지 않았기 때문에 그 경우 얻을 수있는 값이 위조되는 것입니다.

당신은 다음과 같이 자세를 다시 계산하는 방법이 필요거야 :

는 "최대"를 생성하기 위해
private void recalculatePosture() 
{ 
    Posture posture = swtShell.getFullScreen()? Posture.FULLSCREEN 
     : swtShell.getMinimized()? Posture.MINIMIZED 
     : swtShell.getMaximized()? Posture.MAXIMIZED 
     : Posture.NORMAL; 
    if(posture != previousPosture) 
    { 
     issue event... 
     previousPosture = posture; 
    } 
} 

, "복원을 (

그래서, 여기에 대한 해결책입니다 에서 최대화) 및 "전체 화면"이벤트는 Shell.addListener()을 사용하여 SWT.MoveSWT.Resize 이벤트를 수신하고 발생하면 recalculatePosture()을 호출 할 수 있습니다.

"최소화 된"이벤트를 생성하려면 ShellListenershellIconified() 메서드를 @ the.duckman이 말한대로 사용하고 recalculatePosture()을 다시 호출하면됩니다.생성하기 위해

경우, 당신은에서 다음을 수행해야합니다 "(최소화 된 상태로부터) 복원"당신의 ShellListener :이 후 자세의 재 계산을 짧은 시간 의 원인이됩니다

@Override 
protected void onShellDeiconified(ShellEvent e) 
{ 
    display.asyncExec(() -> recalculatePosture()); 
} 

SWT는 쉘의 범위를 적절하게 계산할 수있게 될 것입니다.

관련 문제