2010-03-17 4 views
2

질문으로, 사용자가 노드 위로 마우스를 가져 가면 커서를 HAND_CURSOR으로 변경할 수 있도록 마우스 수신기를 JTree으로 설정하고 싶습니다.JTree에 마우스 수신기를 추가하여 노드 위로 마우스를 가져 가면 커서를 손 모양 커서로 변경할 수 있습니까?

내가 이미 MouseAdapter 이벤트를 클릭하여 처리하는 내 JTree가에 등록되어있는,하지만 난 얻을 수가없는 MouseMoved 또는 MouseEntered/MouseExited 내가 할 노력하고있어 작동합니다.

제안 사항? 트리 노드의 각은이 나무에 관련된 TreeCellRenderer에 의해 생성 된 레이블로 보여되고, JTree 내에서

tree.addMouseMotionListener(new MouseMotionAdapter() { 
    @Override 
    public void mouseMoved(MouseEvent e) { 
     int x = (int) e.getPoint().getX(); 
     int y = (int) e.getPoint().getY(); 
     TreePath path = tree.getPathForLocation(x, y); 
     if (path == null) { 
      tree.setCursor(Cursor.getDefaultCursor()); 
     } else { 
      tree.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); 
     } 
    } 
}); 

답변

7

당신은 MouseMotionListener/Adapter를 추가해야합니다. 일반적으로 사용되는 클래스는 DefaultTreeCellRenderer이며 이것을 렌더링합니다 (DefaultTreeCellRenderer). 따라서 DefaultTreeCellRenderer MouseMotionListener를 추가하여 마우스 커서를 토글 할 수 있습니다.

트리에 MouseMotionListener를 추가하는 것은 마우스가 레이블에있을 때가 아니라 Tree 구성 요소에서 마우스 렌더링을 토글하는 것입니다.

+0

와우,이 작품은 훌륭합니다. 나는 MouseMotionAdapter를 사용할 생각이 전혀 없었다. MouseAdapter가 mouseMoved를 사용하는 것이 아니라 이것이 작동하는 이유를 설명하는주의? – thedude19

+0

MouseAdapter는 MouseAdapter에서도 작동합니다. MouseAdapter는 MouseMotionListener 만 구현하는 반면 MouseAdapter는 거의 모든 마우스 관련 리스너 (MouseListener, MouseWheelListener 및 MouseMotionListener)를 구현합니다. mouseMoved() 메서드는 MouseMotionListener에 선언되어 있으므로 두 어댑터에서 모두 동일합니다. 이 예제에서는 모션에만 관심이 있으므로 MouseMotionListener/Adaptor로 충분하지만 앱이 다른 마우스 이벤트에 관심이있는 경우 MouseAdapter를 사용하는 것이 좋습니다. 희망이 도움이 ... – netzwerg

관련 문제