2014-12-09 4 views
0

나는 두 개의 대화 상자를 동시에 만들었습니다. 이제 한 대화 상자를 다른 대화 상자에 도킹하고 싶습니다. 그래서 사람이 움직이면 다른 사람도 움직일 것입니다.자바가 다른 대화 상자에 대화 상자를 도킹합니다

리스너를 구현하려고했지만 대화 상자가 닫힌 후에 호출되기 때문에 작동하지 않습니다.

public class DialogOne extends TitleAreaDialog { 

    public DialogOne(Shell parentShell) { 
     super(parentShell); 
    } 

    @Override 
    public void create() { 
     super.create(); 
     setTitle("Dialog One"); 
    } 

    @Override 
    public int open() { 
     Display.getCurrent().asyncExec(new Runnable() { 

      @Override 
      public void run() { 
       DialogTwo dialogTwo = new DialogTwo(getShell()); 
       dialogTwo.open(); 
       dialogTwo.addControlListener(new ControlAdapter() { 

        @Override 
        public void controlMoved(ControlEvent e) { 
         System.out.println("Moved"); 

        } 
       }); 

      } 
     }); 
     return super.open(); 
    } 

    @Override 
    protected void setShellStyle(int newShellStyle) { 
     super.setShellStyle(SWT.CLOSE | SWT.MODELESS | SWT.BORDER | SWT.TITLE); 
     setBlockOnOpen(false); 
    } 
} 

public class DialogTwo extends TitleAreaDialog { 

    private Composite composite; 

    public DialogTwo(Shell parentShell) { 
     super(parentShell); 
    } 

    @Override 
    public void create() { 
     super.create(); 
     setTitle("Dialog Two"); 
    } 

    @Override 
    protected void setShellStyle(int newShellStyle) { 
     super.setShellStyle(SWT.CLOSE | SWT.MODELESS | SWT.BORDER | SWT.TITLE); 
     setBlockOnOpen(false); 
    } 

    @Override 
    protected Control createDialogArea(Composite parent) { 
     composite = (Composite) super.createDialogArea(parent); 
     return composite; 
    } 

    public void addControlListener(ControlListener listener) { 
     composite.addControlListener(listener); 
    } 
} 

두 번째 대화 상자에서 경계를 가져 와서 두 번째 대화 상자 옆의 위치를 ​​다시 잡으려면 어떻게해야합니까? 두 번째가 움직일 때도.

+0

"코드 스 니펫"기능을 사용하지 마십시오. JavaScript로만 사용됩니다. 나는 이번에 당신을 위해 그것을 제거했습니다. – Baz

답변

1

나는 나의 요구 사항을 충족시키는 방법을 발견했다. 내가 먼저 dialogTwo.create()이라는 대화 상자를 만들 수 있다는 것을 알아 냈습니다. 대화가 열리기 전에 원하는 것을 할 수 있습니다. 이 경우에는 쉘을 사용하고 컨트롤 리스너를 추가하십시오.

public class DialogOne extends TitleAreaDialog { 

    private Shell dialogShell; 

    public DialogOne(Shell parentShell) { 
    super(parentShell); 
    } 


    @Override 
    public void create() { 
    super.create(); 
    setTitle("Dialog One"); 
    getShell().addControlListener(new ControlAdapter() { 


     @Override 
     public void controlMoved(ControlEvent controlevent) { 
     moveDialog(DialogOne.this.getShell()); 

     } 
    }); 
    } 


    @Override 
    protected Control createDialogArea(Composite parent) { 
    Composite composite = (Composite) super.createDialogArea(parent); 
    createSecondDialog(); 
    return composite; 
    } 

    private void createSecondDialog() { 
    final DialogTwo dialogTwo = new DialogTwo(getShell()); 
    dialogTwo.create(); 
    dialogShell = dialogTwo.getShell(); 
    dialogShell.addControlListener(new ControlAdapter() { 


     @Override 
     public void controlMoved(ControlEvent e) { 
     moveDialog(dialogShell); 

     } 
    }); 

    Display.getCurrent().asyncExec(new Runnable() { 


     @Override 
     public void run() { 

     dialogTwo.open(); 
     } 
    }); 

    } 

    protected void moveDialog(Shell shell) { 
    Rectangle rightBounds; 
    int dialogBorder = 10; 
    if (shell.equals(getShell())) { 
     rightBounds = shell.getBounds(); 
     dialogShell.setLocation(rightBounds.width + rightBounds.x + dialogBorder, rightBounds.y); 
    } else { 
     rightBounds = dialogShell.getBounds(); 
     Rectangle leftBounds = getShell().getBounds(); 
     getShell().setLocation(
     rightBounds.x - leftBounds.width - dialogBorder, 
     rightBounds.y); 
    } 
    } 


    @Override 
    protected void setShellStyle(int newShellStyle) { 
    super.setShellStyle(SWT.CLOSE | SWT.MODELESS | SWT.BORDER | SWT.TITLE); 
    setBlockOnOpen(false); 
    } 
} 
0

dialogTwo.open() 블록 호출. open을 호출하기 전에 dialogTwo.setBlockOnOpen(false)을 추가하면 비 차단 동작을 얻을 수 있습니다.

두 번째 사항은 ControlListener를 해당 자식이 아닌 셸에 추가해야한다는 것입니다. 그래야 작동합니다.

  DialogTwo dialogTwo = new DialogTwo(getShell()); 
      dialogTwo.setBlockOnOpen(false); 
      dialogTwo.open(); 
      dialogTwo.getShell().addControlListener(new ControlAdapter() { 

       @Override 
       public void controlMoved(ControlEvent e) { 
        System.out.println("Moved"); 

       } 
      });