2012-12-13 2 views
1

TextArea가 추가 된 smartgwt Canvas가 있습니다. 사용자가 캔버스의 아무 곳이나 클릭 할 때 MouseDown 이벤트를 처리하고 테두리를 변경하려고합니다. 내 코드는 다음과 같습니다.SmartGWT : Canvas의 하위 요소를 클릭하면 마우스 처리

final com.smartgwt.client.widgets.Canvas can = new com.smartgwt.client.widgets.Canvas(); 
can.setCanFocus(true); 
can.setBorder("2px Solid Blue"); 
can.setCanDragResize(true); 
TextArea ta = new TextArea(); 
can.addChild(ta); 
can.addMouseDownHandler(new MouseDownHandler() { 

      @Override 
      public void onMouseDown(MouseDownEvent event) { 

       ChangeCanvasBorder(can); 

      } 
     }); 

Canvas에 포함 된 TextArea를 클릭하면 MouseDown 이벤트가 발생하지 않습니다. 캔버스 하위 요소를 클릭하여 처리하는 방법이 있습니까?

나는 새로운 것을 알고 싶습니다. 일부 구성을 놓친 것 같습니다.

다른 방법으로 나는 gwt의 FocusPanel을 시도하고 FocusPanel에 추가 된 TextArea를 클릭하면 MouseDown을받을 수 있습니다.

저는 smartgwt 2.4 및 gwt 2.4를 사용하고 있습니다.

도움을 위해 미리 감사드립니다.

+0

내가 맞다면 TextArea는 GWT 위젯입니다. SmartGWT와 GWT 위젯을 혼합하는 것은 가능한 한 피해야 만합니다. 또는 생성 된 모든 레이아웃 문제를 해결할 때 많은 어려움을 겪을 것입니다. SmartGWT를 다룰 때 많은 기이함과 비 직관적이고 명확하지 않은 동작을 기대해야합니다. SmartGWT 또한 매우 무겁고 적당히 좋은 컴퓨터에서도 천천히 작동합니다. 어쨌든, SmartGWT는 폼 위젯에 삽입해야하는 TextAreaItem을 노출합니다. – ZalewaPL

+0

@ ZelwaPL, 빠른 답장을 보내 주셔서 감사합니다. 당신과 동의, 나는 가능한 한 많이 SmartGWT 위젯을 고수하기 위해 프로젝트를 변경했다. – user1899956

답변

1

ZalewaPL이 말했듯이 gwt와 smartgwt 위젯을 함께 사용하지 않는 것이 좋습니다. DynamicForm에 추가 된 smartgwt의 TextAreaItem을 사용하는 것이 좋습니다. 다음은 간단한 예입니다

final Canvas can = new Canvas(); 
can.setCanFocus(true); 
can.setBorder("2px Solid Blue"); 
can.setCanDragResize(true); 
DynamicForm form = new DynamicForm(); 
TextAreaItem tai = new TextAreaItem("textarea"); 
form.setFields(tai); 
can.addChild(form); 
can.addMouseDownHandler(new MouseDownHandler() { 

    @Override 
    public void onMouseDown(MouseDownEvent event) { 
     changeCanvasBorder(can); 
    } 
}); 

그러나 당신은 여전히 ​​GWT에서 텍스트 영역 위젯을 사용하려는 경우, 당신은이 작업을 수행 할 수 있습니다

abstract class CustomMouseDownHandler implements com.smartgwt.client.widgets.events.MouseDownHandler, com.google.gwt.event.dom.client.MouseDownHandler { 
    @Override 
    public void onMouseDown(com.smartgwt.client.widgets.events.MouseDownEvent event) { 
     onMouseDown(); 
    } 

    @Override 
    public void onMouseDown(com.google.gwt.event.dom.client.MouseDownEvent event) { 
     onMouseDown(); 
    } 

    public abstract void onMouseDown(); 
} 

final Canvas can = new Canvas(); 
can.setCanFocus(true); 
can.setBorder("2px Solid Blue"); 
can.setCanDragResize(true); 
TextArea ta = new TextArea(); 
CustomMouseDownHandler mdh = new CustomMouseDownHandler() { 

    @Override 
    public void onMouseDown() { 
     changeCanvasBorder(can); 
    } 
}; 
ta.addMouseDownHandler(mdh); 
can.addChild(ta); 
can.addMouseDownHandler(mdh); 

이 하나가되는 구현하는 새로운 핸들러 추상 클래스를 생성 두 MouseDownHandler 인터페이스는 onMouseDown 메서드를 새 onMouseDown 메서드로 전달합니다. 이 추상 클래스에 대한 구현을 하나 만들고 Canvas 및 TextArea 위젯에 사용해야합니다.

+0

답변 해 주셔서 감사합니다. 나는 첫 번째 제안을 선택한다. 이제 mousedown 이벤트를들을 수 있습니다. – user1899956

관련 문제