JTree
ユーザーがツリー ノードの上にマウスを置いたときに、ユーザーに説明を表示したいと考えています。
これに を使用できるドキュメントを読みましMouseMotionListener
た。しかし、マウスが移動したノードの値を取得するにはどうすればよいでしょうか?
どんなポインタも非常に役に立ちます。
JTree
ユーザーがツリー ノードの上にマウスを置いたときに、ユーザーに説明を表示したいと考えています。
これに を使用できるドキュメントを読みましMouseMotionListener
た。しかし、マウスが移動したノードの値を取得するにはどうすればよいでしょうか?
どんなポインタも非常に役に立ちます。
からノードの値を取得する 1 つの方法MouseEvent
はTreePath
、マウスの x、y 位置の を取得し、このパスから最後のパス コンポーネントをフェッチすることです。
これは次のようになります。
import javax.swing.tree.TreePath;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import javax.swing.JTree;
...
final JTree tree = new ...
tree.addMouseMotionListener(new MouseMotionListener() {
@Override
public void mouseMoved(MouseEvent e)
{
TreePath path = tree.getPathForLocation(e.getX(), e.getY());
if(path == null || path.getLastPathComponent() == null)
{
return;
}
Object nodeHoveredOver = path.getLastPathComponent();
System.out.println(path.getLastPathComponent());
}
@Override
public void mouseDragged(MouseEvent e)
{
...
}
});
ただし、説明をツールチップとして表示したい場合は、このソリューションの方が適している場合があります。
JTree#getTooltipText
実装を見てみましょう:
public String getToolTipText(MouseEvent event) {
String tip = null;
if(event != null) {
Point p = event.getPoint();
int selRow = getRowForLocation(p.x, p.y);
TreeCellRenderer r = getCellRenderer();
if(selRow != -1 && r != null) {
TreePath path = getPathForRow(selRow);
Object lastPath = path.getLastPathComponent();
Component rComponent = r.getTreeCellRendererComponent
(this, lastPath, isRowSelected(selRow),
isExpanded(selRow), getModel().isLeaf(lastPath), selRow,
true);
if(rComponent instanceof JComponent) {
//...
tip = ((JComponent)rComponent).getToolTipText(newEvent);
}
}
}
// No tip from the renderer get our own tip
if (tip == null) {
tip = getToolTipText();
}
return tip;
}
そのため、レンダラーによって指定されたツールチップ テキストが尊重されます。