2016-11-28 3 views
0

월드 윈드 디스플레이에 마우스 오른쪽 버튼 JPopupMenu을 추가해야합니다. 월드 윈드 디스플레이는 JPanel입니다. 꽤 많이 방금 월드 변수의 예제 인 ApplicationTemplate 클래스의 내부 변수 인 ApplicationTemplate.AppPanel의 멤버 변수와 메서드를 복사하여 GUI에 붙여 넣었고 this.add(component) 참조를 복사 된 코드에서 myJPanel.add(component)으로 변경했습니다.월드 윈 도우에서 JPopupMenu 가져 오기

팝업 메뉴가 부족한 것 외에는 큰 효과가있었습니다. 내 응용 프로그램에 월드 윈드 (World Wind) 디스플레이가 임베드되어 있으며 응용 프로그램의 대화 상자에서이를 제어하고 있습니다.

세계 풍력 디스플레이의 JPanelJPopupMenu을 추가 한 후 전혀 표시되지 않는 것 같습니다. 마우스 오른쪽 버튼을 클릭하면 아무 것도 나타나지 않습니다. 이 메뉴는 World Wind 디스플레이 (WWD는CENTER, 다른 구성 요소는 북쪽에 있음) 위의 구성 요소에 메뉴를 첨부 할 수 있기 때문에 메뉴를 숨기는 가벼운 Java 구성 요소 문제와는 달리 중량급이라고 생각하지 않습니다. 메뉴가 행복하게 월드 윈드 디스플레이의 공간에 들어간다. 그냥 안전을 위해, 내가 설정 한 JPopupMenusetLightWeightPopupEnabled(false)와 정적 초기화 나는 세계 풍력 디스플레이를 포함하는 JPanel에 부착 된 MouseListener와 테스트를했다

JPopupMenu.setDefaultLightWeightPopupEnabled(false)했다 메인 클래스의 상단, 그리고 아무도에서 MouseListener 이벤트가 트리거됩니다. 따라서 내 생각에 JPanelJPopupMenu을 추가하지 말고 wwd 개체의 특정 하위 구성 요소에 추가해야합니다. wwd 객체 자체에는 팝업 메뉴를 추가하는 메소드가 없으므로 wwd 메소드에서 "getGLCanvas"와 같은 것을 보지 못합니다. 여기서 올바른 길을 가고 있다면 메뉴를 추가 할 구성 요소는 무엇이며 해당 구성 요소에 액세스하려면 어떻게해야합니까?

제 질문은 매우 간단합니다. 또는 어떻게 보일지 : 을 월드 윈드 디스플레이에 가져 오려면 어떻게해야합니까?

이 질문은 디스플레이에 MouseListener을 가져 오는 것과 동일하게 시작되지만 그 대답은 디스플레이에서 JPopupMenu이되는 대답에서 제외된다고 가정합니다.

다음은 내가 삽입 한 월드 윈드 템플릿 코드와 그에 대한 수정 내용입니다. 다른 클래스에서는 getComponent()을 사용하여 응용 프로그램의 사용자 인터페이스에 World Wind 디스플레이가 포함 된 JPanel을 추가합니다. 나는 그것이 중요한 경우에 대비하여 내가 코멘트 한 기본 World Wind 스터프를 남겼다. 레이어 이름의 String []을 통한 루프는지도와 단위 크기 만 쉽게 표시 할 수있는 방법이었습니다. JPopupMenu 코드가 생성자의 중간에 있습니다. 지저분한 코드에 사과드립니다.하지만 최대한의 도움을 받아야한다고 생각했습니다.

class MyClass 
{ 

protected JComponent component; 
public JComponent getComponent() { return component; } 

protected WorldWindow wwd; 
protected StatusBar statusBar; 
protected ToolTipController toolTipController; 
protected HighlightController highlightController; 

MyClass() 
{ 
    boolean includeStatusBar = false; 
    component = new JPanel(new BorderLayout()); 

    this.wwd = this.createWorldWindow(); 
    ((Component) this.wwd).setPreferredSize(new Dimension(200,200));//canvasSize); 

    // Create the default model as described in the current worldwind properties. 
    Model m = (Model) WorldWind.createConfigurationComponent(AVKey.MODEL_CLASS_NAME); 
    this.wwd.setModel(m); 

    // Setup a select listener for the worldmap click-and-go feature 
//   this.wwd.addSelectListener(new ClickAndGoSelectListener(this.getWwd(), WorldMapLayer.class)); 

    component.add((Component) this.wwd, BorderLayout.CENTER); 
    if (includeStatusBar) 
    { 
     this.statusBar = new StatusBar(); 
     component.add(statusBar, BorderLayout.PAGE_END); 
     this.statusBar.setEventSource(wwd); 
    } 

    // Add controllers to manage highlighting and tool tips. 
//   this.toolTipController = new ToolTipController(this.getWwd(), AVKey.DISPLAY_NAME, null); 
//   this.highlightController = new HighlightController(this.getWwd(), SelectEvent.ROLLOVER); 

    java.util.List<String> desiredLayers = Arrays.asList(
     new String[] { "Blue Marble May 2004", /*"i-cubed Landsat",*/ "Scale bar" 
     }); 
    for(Layer layer : getWwd().getModel().getLayers()) 
    { 
     if(desiredLayers.contains(layer.getName())) 
     { 
      System.out.println("INCLUDE " + layer.getName()); 
      layer.setEnabled(true); 
     } 
     else 
     { 
      System.out.println("EXCLUDE " + layer.getName()); 
      layer.setEnabled(false); 
     } 
    } 


    JMenu menuZoom = new JMenu("Zoom"); 
    JMenuItem menuZoom_1028 = new JMenuItem("1028"); 
    menuZoom.add(menuZoom_1028); 
    JMenuItem menuZoom_512 = new JMenuItem("512"); 
    menuZoom.add(menuZoom_512); 
    JMenuItem menuZoom_256 = new JMenuItem("256"); 
    menuZoom.add(menuZoom_256); 
    JMenuItem menuZoom_128 = new JMenuItem("128"); 
    menuZoom.add(menuZoom_128); 
    JMenuItem menuZoom_64 = new JMenuItem("64"); 
    menuZoom.add(menuZoom_64); 
    JMenuItem menuZoom_32 = new JMenuItem("32"); 
    menuZoom.add(menuZoom_32); 
    JPopupMenu rclickMenu = new JPopupMenu(); 
    rclickMenu.add(menuZoom); 
    component.setComponentPopupMenu(rclickMenu); 

    menuZoom.getPopupMenu().setLightWeightPopupEnabled(false); 

    component.addMouseListener(new MouseListener() 
    { 
     @Override 
     public void mouseClicked(MouseEvent e) 
     { 
      System.out.println("mouseClicked"); 
     } 

     @Override 
     public void mousePressed(MouseEvent e) 
     { 
      System.out.println("mousePressed"); 
     } 

     @Override 
     public void mouseReleased(MouseEvent e) 
     { 
      System.out.println("mouseReleased"); 
     } 

     @Override 
     public void mouseEntered(MouseEvent e) 
     { 
      System.out.println("mouseEntered"); 
     } 

     @Override 
     public void mouseExited(MouseEvent e) 
     { 
      System.out.println("mouseExited"); 
     } 
    }); 
} 

protected WorldWindow createWorldWindow() 
{ 
    return new WorldWindowGLCanvas(); 
} 

public WorldWindow getWwd() 
{ 
    return wwd; 
} 

public StatusBar getStatusBar() 
{ 
    return statusBar; 
} 
} 

답변

0

많은 파기 후에 마침내 해결 방법을 알아 냈습니다.

우선은 세계 바람 WWD 개체에서 GLPanel을 얻기에 관하여 나의 바보 하위 문제를 해결합니다 다음 WWD 객체 GLPanel이다. 음, 기술적으로는 WorldWindow이 인터페이스이지만, 내가 뽑을 World Wind ApplicationTemplate 응용 프로그램의 경우 WorldWindow의 구현은 GLPanel으로 확장되는 클래스입니다. 나는 그것을 한동안 알아 차리지 못했다.

월드 윈드 디스플레이가 포함 된 JPanel에 적용된 마우스 수신기는 마우스 동작을 트리거하지 않으며 월드 윈드 디스플레이에는 마우스 수신기를 추가하는 방법이 없습니다. 마침내 World Window에 마우스 수신기를 추가 할 수있는 객체를 반환하는 getInputHandler()이 있다는 것을 깨달았습니다. 그래서해야만 했어. wwd.getInputHandler().addMouseListener(myMouseAdapter);

내가 생각하기에, JPopupMenu은 월드 윈드 디스플레이에 의해 숨겨져 있지 않았다. 팝업으로 방아쇠를 당기지 않았습니다. 위의 마우스 리스너에 대한 수정으로 스윙의 기본 제공 마우스 오른쪽 버튼 JPopupMenu 지원 대신에 팝업을 직접 열어서이를 해결했습니다. 나는 마우스 수신기에서 jPopupMenu.show(component, event.getX(), event.getY());으로 전화하여이 작업을 수행했습니다.

wwd.getInputHandler().addMouseListener(new MouseAdapter() 
    { 
     @Override 
     public void mouseClicked(MouseEvent event) 
     { 
      // right-click context-menu 
      if(event.getButton() == MouseEvent.BUTTON3) 
      { 
       // component is my JPanel which contains the WorldWindow 
       rclickMenu.show(component, event.getX(), event.getY()); 
      } 
     } 
    }); 

가 나는 또한 내가에서 언급거야하는 데 필요한 몇 가지를 추가 : 여기

내가 팝업 메뉴를 (세계 풍력 물건에 대한 초기화 코드에서) 만든 코드 유용한 경우. 마우스 오른쪽 버튼으로 클릭 한 점이 특별히 세계지도에 있는지 확인하기위한 검사를 추가했으며 마우스 오른쪽 버튼으로 클릭 한 항목과 상호 작용하기 위해 일부 메뉴 항목이 상호 작용하기 때문에 나중에 마우스 포인터를 오른쪽 클릭했는지 알고 싶었습니다.

wwd.getInputHandler().addMouseListener(new MouseAdapter() 
    { 
     @Override 
     public void mouseClicked(MouseEvent event) 
     { 
      // right-click context-menu 
      if(event.getButton() == MouseEvent.BUTTON3) 
      { 
       Position p = wwd.getCurrentPosition(); 
       // abort if not on-map 
       if(p == null) return; 

       // need later to know what was right-clicked on 
       mPositionAtRightClickMoment = wwd.getCurrentPosition(); 

       rclickMenu.show(component, event.getX(), event.getY()); 
      } 
     } 
    }); 
:

는 이러한 추가 후, 코드는 다음처럼 보였다