2014-06-19 4 views
5

일부 마우스 수신기를 GWT의 MenuBar 하위 메뉴/계단식 메뉴에 추가하려고합니다. 슬프게도, 나는 하위 메뉴 popuppanel에 직접 액세스 할 수없는 것처럼 보입니다. 그렇게하는 방법 (getPopup())은 private입니다. 그리고 GWT 컴파일 방식으로 인해 리플렉션을 통해 액세스 할 수 없습니다.GWT 메뉴 모음 팝업 패널/하위 메뉴에 액세스하려면 어떻게합니까?

주 메뉴 모음에 마우스 수신기를 추가하면 (마우스가 메뉴 막대 경계 안에있을 때 감지) 좋고 간단합니다. 그러나 마우스가 계단식 하위 메뉴 중 하나에있을 때 알려주는 마우스 수신기를 추가하는 방법을 알아낼 수는 없습니다.

com.google.gwt.user.client.ui.MenuBar myMainBar = new MenuBar(); 
myMainBar.addDomHandler(menuHoverOutHandler, MouseOutEvent.getType()); 
myMainBar.addDomHandler(menuHoverOverHandler, MouseOverEvent.getType()); 

이 실제 GWT MenuBar의 위대한 작품 :

는 내가 뭐하는 거지하는 것은 이것이다. 마우스를 꽂으면 mouseOverEvent가 트리거됩니다. 마우스를 뽑으면 MouseOutEvent가 트리거됩니다.

문제는 메인 메뉴 바에서 하위 메뉴를 열면 해당 메뉴에 마우스를 올리면 MouseOutEvent가 트리거된다는 것입니다. 나는 그렇게하지 말아야한다. 내가 말할 때

하위 메뉴 나는 여기에서 보이는 것과 같은 의미 :

http://www.gwtproject.org/javadoc/latest/com/google/gwt/user/client/ui/MenuBar.html

그래서 오랫동안 나는 스타일, 과일 및 기간, 마우스를 나열하는 '주'줄이야로 이벤트가이를 인식합니다.

하지만 굵게, 기울임 꼴로 표시되는 하위 메뉴로 내려 가면 마우스 이벤트가 메뉴 모음을 완전히 떠났다 고 생각합니다. 마우스가 이러한 부 메뉴 중 하나에 있는지 확인하는 방법이 필요합니다. 당신은 단순히

myMainBar.getPopup() 

을하고 getPopup이 비공개로 결과 PopupPanel에 청취자를 추가 할 수 없습니다

(또는이 메인 메뉴 바의 하위 메뉴가 어딘가 열려 있음). MenuBar.popup에 접근 할 다른 방법을 찾고 있어요

하위 메뉴 중 하나가 열려 있는지 알려주는 방법이없는 것 같습니다. 이는 다소 당혹 스럽습니다. 이 하위 메뉴와 상호 작용할 수있는 능력이 절망적으로 부족한 것 같아요. 내가 뭔가를 놓치고 있는지 궁금합니다.

+1

코드에 어떻게 액세스합니까? :) 당신이하고있는 일에 대해 알려주는 코드를 공유 할 수 있습니까? – Braj

+0

나는 내가하고있는 것을 보여주는 몇 가지 코드와 몇 가지 추가 설명을 추가했다. 좀 봐 주셔서 감사합니다! – user2197116

+0

해결할 수 있었습니까? 지금 당장이 문제에 직면하고 있습니다 ... – Sleeper9

답변

4

MouseOverHandlerMouseOutHandler을 기본 메뉴 표시 줄과 반대로 각 하위 메뉴에 추가하면 원하는대로 할 수 있습니다. 예를 들어

:

MenuBar subMenu = new MenuBar(true); 
subMenu.addItem("Item1", new Command() { 
    @Override 
    public void execute() { 
     Window.alert("Item1 clicked"); 
    } 
}); 

subMenu.addDomHandler(new MouseOverHandler() { 
    @Override 
    public void onMouseOver(MouseOverEvent arg0) { 
     Window.alert("SubMenu over!"); 
    } 
}, MouseOverEvent.getType()); 

subMenu.addDomHandler(new MouseOutHandler() { 
    @Override 
    public void onMouseOut(MouseOutEvent arg0) { 
     Window.alert("SubMenu out!"); 
    } 
}, MouseOutEvent.getType()); 

MenuBar mainMenu = new MenuBar(); 
mainMenu.addItem("SubMenu", subMenu); 

RootPanel.get().add(mainMenu); 
+1

OP는 이것을 사용하여 플래그를 설정하고 하위 메뉴가 '튀어 나왔다'면 메인 메뉴 바에서 MouseOutEvent를 무시합니다. – Brian

2

귀하의 문제는 이벤트의 논리와 관련이 그것을 자기 : 당신은 트리거 경우에만 메뉴의 마우스 이동 밖으로하지 않는 이벤트의 새로운 유형을 가지고 싶습니다 메뉴간에 이동하는 경우.

이 작업을 수행하려면 마우스 오버 및 마우스 아웃을 수신하는 코드를 추가하고 사용 가능한 정보를 컴파일하여 발생한 상황을 이해할 수 있습니다.

모든 이벤트는 정적 클래스 인스턴스의 상태를 업데이트하는 onMouseOut() 내부에 넣어되어야 Scheduler

Scheduler.get().scheduleDeferred(new Command() { 
    public void execute() { 
     //check all what happened in a static shared variable, there was a mouse out, was there a mouse over after it? if yes then stay calm; If there wasn't, then trigger a MouseOutOfAllMenus event 
    } 
    }); 

이 코드와 다른 코드를 사용하여 통과 한 후이 코드를 실행해야 할 수 있습니다 onMouseOver()에 입력해야합니다. 일정 지연 메커니즘 덕분에 onMouseOver()이 실행 된 후에 Scheduler.execute()의 코드가 실행될 것입니다. 그래서 상태를 확인하기 위해 올 때, 마우스가 다른 메뉴에 들어간 후 (또는하지 않은 것)가됩니다. 따라서 사용자가 메뉴 항목을 실제로 남겼는지 아니면 하위 메뉴에 입력했는지 알 수 있습니다.

마지막 추천 : 별도의 클래스에서이 코드를 수행하면 나중에 사용할 수 있도록이 강화 된 메뉴를 구성 요소로 사용할 수 있습니다. 또한 별도의 항목을 유지함으로써 자동화 된 테스트 시나리오를 훨씬 쉽게 테스트하고 실행할 수 있음을 명심하십시오.

난 당신이 내가하지 않을 경우, 의견을 자유롭게 설명하려고 노력하는 모든 이해 희망, 나는 당신에게

최고 감사합니다,

PS 답변을 위해 최선을 노력 할게요 : 내가 정적 인스턴스를 말할 때 상태, 이해의 용이함을위한 것입니다. 동일한 응용 프로그램에서 둘 이상의 메뉴를 가질 수 있으려면 정적 사용을 피하는 것이 좋습니다. 정적이란 말은 다음과 같습니다. 모든 구성 요소에서 액세스 할 수있는 인스턴스