2012-12-23 1 views
0

Composite 개체에 일부 개체를 추가하고 싶습니다. .컴포지트 내에서 선택적 메뉴 감지

public class Circle extends Canvas { 
} 

public class Rectangle extends Canvas { 
} 

... 

는 내가 원하는 모양을 얻을 수있는 Canvas에 그리는 방법을 알고 : 객체가 다른 모양을 가질 수있다 (사각형, 원, 타원 또는 다각형으로 표시도 이상한 모양() 그래서 같은 클래스를 정의 그러나 나는 또한 사용자가 캔버스 영역 내에서 마우스를 클릭하는 경우에만 팝업 메뉴는 각 캔버스에 나타납니다 것으로 예상, 그래서 복합 클래스에서이 코드를 사용하는 경우 :

Menu aSampleMenu = new Menu(this); 

Circle circle = new Circle(parent, style); 
circle.setMenu(aSampleMenu); 

메뉴는 사용자 클릭이 경우에 나타납니다 모양 영역 밖에서도 캔버스 내부의 아무 곳에서나 마우스 오른쪽 버튼을 누릅니다.이 문제를 해결하려면 어떻게합니까?

+0

당신은 어떤 다른 가능성을 보았는가? ady가이 문제를 해결합니까? draw2d 또는 GEF와 같은 써드 파티 API를 사용하는 것과 마찬가지로, 이러한 간단한 작업을 훨씬 쉽게 할 수 있습니다. –

+0

나는 대안을 제안하려고 시도했다. [여기] (http://stackoverflow.com/a/13976303/1449199). GEF는 너무 무거울 수도 있습니다. – Baz

답변

0

아래의 코드 스 니펫을 살펴보십시오. 트릭에만 메뉴 검출 허용해야 그 Control S로 설정 한 후 먼저 Menu을 정의하고있다 : 여기

public class StackOverflow 
{ 
    public static void main(String[] args) 
    { 
     Display display = new Display(); 
     Shell shell = new Shell(display); 
     shell.setLayout(new GridLayout(2, true)); 

     Composite c1 = new Composite(shell, SWT.BORDER); 
     c1.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); 

     Composite c2 = new Composite(shell, SWT.BORDER); 
     c2.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); 

     Menu menu = new Menu(shell, SWT.POP_UP); 
     MenuItem item = new MenuItem(menu, SWT.PUSH); 
     item.setText("Popup"); 

     new Label(shell, SWT.BORDER).setText("No menu here"); 
     new Label(shell, SWT.BORDER).setText("No menu here"); 

     // Add menu only to c1 and c2, not to the shell and not to the labels 
     c1.setMenu(menu); 
     c2.setMenu(menu); 

     shell.setSize(300, 300); 
     shell.open(); 
     while (!shell.isDisposed()) 
     { 
      if (!display.readAndDispatch()) 
       display.sleep(); 
     } 
     display.dispose(); 
    } 
} 

하는 스크린 샷이다

enter image description here

+0

고맙습니다. 아직 답변이 아닙니다. 귀하의 경우, 예를 들어, 캔버스 'c1'에서 원을 그리면 모든 캔버스 영역 내부가 아니라 ** 사용자가 원 영역 ** 내부를 ** 클릭하는 경우에만 팝업 메뉴가 나타납니다. 지역을 사용하는 솔루션을 찾았습니다 (아래의 내 대답 참조). 그것은 폴리곤에 완벽하게 적용될 수 있지만, 원에 대한 사용법 (어쩌면 포인트 배열로 원을 표현할 필요가 있을지도 모릅니다)을 파악할 수 없습니다. 아시다시피, 내게 알려주십시오 ... –

+1

@HieuNguyen 좋아, 내 접근 방식은 클릭 이벤트가 발생한'캔버스'를 감지합니다. 나는 당신이 당신의 cicle의 반경과 중심을 알고 있다고 생각합니다. 그런 다음 클릭과 센터 사이의 유클리드 거리를 계산하여 클릭이 원 안에 있는지 확인할 수 있습니다. 이 값이 반지름보다 작거나 같으면 클릭은 그렇지 않은 것입니다. – Baz

+0

예 정말로 도움을 주셔서 감사합니다. 어쩌면 영어로 의사 소통하는데 몇 가지 어려움이 있습니다. 다음 번에 내 문제를 더 분명하게 설명하려고 노력할 것입니다. D –

0

한가지 해결책은 영역을 사용하지만 나는 아직도 그것이 원형 케이스에 어떻게 적용될 수 있는지 알아 내지 못한다 :

Region region = new Region(); 
    region.add(new int[] {3, 3, 20, 20, 3, 20}); 

    Canvas c = new Canvas(this, SWT.NONE); 
    c.setBounds(35, 35, 60, 60); 
    c.setRegion(region); 

    Menu menu = new Menu(this); 
    c.setMenu(menu); 

    MenuItem mntmProperties = new MenuItem(menu, SWT.NONE); 
    mntmProperties.setText("Properties"); 

    MenuItem mntmDelete = new MenuItem(menu, SWT.NONE); 
    mntmDelete.setText("Delete");