2013-01-25 1 views
1

커서가 전체 구성 요소가 아니라 나열된 요소에만있는 경우 JTree 구성 요소 위로 마우스를 이동하면 커서가 손 모양으로 변경됩니다.JTree에 나열된 요소에서 마우스 이동시 커서를 변경하고 싶습니다.

아래 코드는 Jlist 구성 요소입니다. JTree과 동일하지만 JTree에는getCellBound()이 없습니다. 다른 방법이 있습니까? 당신이 뭔가를 찾고 있습니다

final JList list = new JList(new String[] {"a","b","c"}); 
list.addMouseMotionListener(new MouseMotionListener() { 
@Override 
public void mouseMoved(MouseEvent e) { 
    final int x = e.getX(); 
    final int y = e.getY(); 
    // only display a hand if the cursor is over the items 
    final Rectangle cellBounds = list.getCellBounds(0, list.getModel().getSize() - 1); 
    if (cellBounds != null && cellBounds.contains(x, y)) { 
     list.setCursor(new Cursor(Cursor.HAND_CURSOR)); 
    } else { 
     list.setCursor(new Cursor(Cursor.DEFAULT_CURSOR)); 
    } 
} 

@Override 
public void mouseDragged(MouseEvent e) { 
} 
}); 
+0

빨리,이 [SSCCE] (HTTP를 게시 : // sscce.org/). –

+0

나는 문제가 무엇인지 모르겠다. 그것은 나를 위해 일하는 것 같다. 그리고 당신의 제목은 "JTree"라고하지만, 당신의 코드는 "JList"라고합니다 : 어느 것이지? –

+0

@Guillaume Polet : 코드를 잊어 버리면 커서가 JTree 구성 요소의 일부에 커서가 있지 않을 때 커서가 표시된 요소 위로 이동하는 경우에만 Jtree 구성 요소에 손 모양 커서를 놓기 만하면됩니다. JTree –

답변

4

는 것 같아요 :

import java.awt.Cursor; 
import java.awt.Rectangle; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 

import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTree; 
import javax.swing.SwingUtilities; 
import javax.swing.tree.DefaultMutableTreeNode; 
import javax.swing.tree.DefaultTreeModel; 
import javax.swing.tree.TreePath; 

public class TestTreeSelection { 

    protected void initUI() { 
     final DefaultMutableTreeNode root = new DefaultMutableTreeNode("Root"); 
     fillTree(root, 5, "Some tree label"); 
     final DefaultTreeModel model = new DefaultTreeModel(root); 
     final JTree tree = new JTree(model); 
     tree.addMouseMotionListener(new MouseAdapter() { 
      @Override 
      public void mouseMoved(MouseEvent e) { 
       boolean inside = false; 
       TreePath path = tree.getPathForLocation(e.getX(), e.getY()); 
       if (path != null) { 
        Rectangle pathBounds = tree.getPathBounds(path); 
        inside = pathBounds.contains(e.getPoint()); 
       } 
       if (inside) { 
        tree.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); 
       } else { 
        tree.setCursor(Cursor.getDefaultCursor()); 
       } 
      } 
     }); 
     JFrame f = new JFrame(); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(new JScrollPane(tree)); 
     f.setSize(400, 600); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 

    private void fillTree(DefaultMutableTreeNode parent, int level, String label) { 
     for (int i = 0; i < 5; i++) { 
      DefaultMutableTreeNode node = new DefaultMutableTreeNode(label + " " + i); 
      parent.add(node); 
      if (level > 0) { 
       fillTree(node, level - 1, label); 
      } 
     } 
    } 

    public static void main(String[] args) { 

     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new TestTreeSelection().initUI(); 
      } 
     }); 
    } 

} 
+0

많이 고맙습니다 ...... 작동합니다. –

0

이 코드는 작동합니다

더 나은 도움말을
 tree_object.addMouseMotionListener(new MouseMotionListener() { 

       @Override 
       public void mouseDragged(MouseEvent e) { 

       } 

       @Override 
       public void mouseMoved(MouseEvent e) { 
        TreePath tp = ((JTree)e.getSource()).getPathForLocation(e.getX(), e.getY()); 

        if(tp != null) 
        { 
         ((JTree)e.getSource()).setCursor(new Cursor(Cursor.HAND_CURSOR)); 
        } 
        else 
        { 
         ((JTree)e.getSource()).setCursor(new Cursor(Cursor.DEFAULT_CURSOR)); 
        } 
       } 
     });