2013-09-24 3 views
5

하위 메뉴에서 항목을 클릭하면 자연스럽게 그 아래에있는 메뉴 항목에 마우스를 그립니다. Windows와 Mac은 기본적으로 메뉴를 열기 전에 작은 지연을 가짐으로써이를 처리합니다. Swing JMenus는 이것을 처리하지 않고, 마우스가 잠시 가리켜 진 메뉴가 마우스가 의도 한 메뉴 항목에 도달하기 전에 열립니다.Java Swing - 하위 메뉴에서 항목을 선택할 때 관대함 추가

예를 들어, 아래 그림에서 Item 3을 선택하려고 시도했지만 마우스가 Menu 2에 잠깐 동안 미끄러지기 전까지 Menu 1 하위 메뉴가 사라졌습니다.

아무도이 문제를 해결하기위한 조언이나 제안이 있습니까? 내 생각은 마우스 처리기에 타이머를 추가 한 사용자 정의 MenuUI를 정의하는 것이 었습니다. delay 매개 변수를 보여 메뉴를 기다릴 밀리 초 단위의 양이 당신의 menu 변수에

public class Thing extends JFrame { 
    public Thing() 
    { 
     super(); 
     this.setSize(new Dimension(500, 500)); 
     final JPopupMenu pMenu = new JPopupMenu(); 
     for (int i = 0; i < 5; i++) 
     { 
      JMenu menu = new JMenu("Menu " + i); 
      pMenu.add(menu); 
      for (int j = 0; j < 10; j++) 
      { 
       menu.add(new JMenuItem("Item " + j)); 
      } 
     } 

     this.addMouseListener(new MouseAdapter() { 

      @Override 
      public void mouseReleased(MouseEvent e) { 
       pMenu.show(Thing.this, e.getX(), e.getY()); 
      } 
     }); 
    } 

    public static void main(String[] args) 
    { 
     Thing t = new Thing(); 
     t.setVisible(true); 
    } 
} 
+0

[이 포스트는 (http://bjk5.com/post/44698559168/breaking-down-amazons-mega-dropdown)을 검사하여이 문제를 해결하는 알고리즘에 관한 것이다 경로를 사용자가 삼각형에 대해 항목에서 멀리 이동할 때 걸리는 경로이지만 그 포스트의 맨 아래에 링크 된 jQuery 스크립트가 어떻게 이식 프레임 워크에 연결되는지는 잘 모르겠습니다. – akbiggs

답변

0

나는 매우 해킹 된 해결책을 생각해 냈습니다.

나는 BasicMenuUI를 확장 한 UI 클래스를 만들었습니다. createMouseInputListener 메서드를 오버라이드하여 handler 개인 개체 대신 MouseInputListener 개체를 BasicMenuUI 안에 반환합니다.

MouseInputListener 구현 코드를 GrepCode [1]의 handler에 가져 와서 내 사용자 지정 수신기에 복사했습니다. 나는 하나의 변화를 만들어 mouseEntered에 타이머를 넣었다. mouseEntered에 대한 나의 최종 코드는 다음과 같습니다

public void mouseEntered(MouseEvent e) { 
     timer.schedule(new TimerTask() { 

      @Override 
      public void run() { 
       if (menuItem.isShowing()) 
       { 
        Point mouseLoc = MouseInfo.getPointerInfo().getLocation(); 
        Point menuLoc = menuItem.getLocationOnScreen(); 
        if (mouseLoc.x >= menuLoc.x && mouseLoc.x <= menuLoc.x + menuItem.getWidth() && 
          mouseLoc.y >= menuLoc.y && mouseLoc.y <= menuLoc.y + menuItem.getHeight()) 
        { 
         originalMouseEnteredStuff(); 
        } 
       } 
      } 
     }, 100); 
    } 

mouseEntered에 있던 원래의 코드를 호출하기 전에, 나는 확실히 마우스가이 메뉴의 영역 내에서 여전히 확인하십시오. 100 밀리 초 후에 내 마우스 브러시가 튀어 나오는 모든 메뉴를 원하지 않습니다.

더 나은 해결책을 발견 한 사람이 있으면 알려 주시기 바랍니다.

[1] http://www.grepcode.com/file_/repository.grepcode.com/java/root/jdk/openjdk/7-b147/javax/swing/plaf/basic/BasicMenuUI.java/?v=source

2

전화 setDelay(delay) : 여기

a screen

내 문제를 보여 몇 가지 간단한 예제 코드입니다 , int로.

하위 메뉴가 표시되기 전에 사용자가 메뉴 항목 "메뉴 N"일초 마우스를 움직일해야하므로, 1 초에 지연을 설정하는 코드의이 다음 줄 : 여기 menu.setDelay(1000);

는 편집의 조각이다 코드 :

for (int i = 0; i < 5; i++) 
{ 
    JMenu menu = new JMenu("Menu " + i); 
    pMenu.add(menu); 
    for (int j = 0; j < 10; j++) 
    { 
     menu.add(new JMenuItem("Item " + j)); 
    } 
    menu.setDelay(1000); 
} 
+0

우연히 마우스를 올려 놓은 메뉴 항목의 하위 메뉴가 지연되는 데 1 초가 걸리지 만 마우스가 다른 메뉴를 가리키면 원하는 하위 메뉴가 즉시 사라지기 때문에 이렇게해도 작동하지 않습니다. – flutillie

+0

다음은 setDelay (1000)를 사용하여 위에서 설명한 스크린 캐스트입니다. http://tinypic.com/r/2wel1dy/5 – flutillie

관련 문제