2008年1月1日火曜日

JAVA6 Swing JTreeでヒントの表示 ヒントの表示位置を、ツリーアイテムに被せる(winのエクスプローラ風)



1.JTreeをツールチップマネージャーに登録します。
2.セルレンダラを設定します。
3.セルレンダラのgetToolTipText(MouseEvent event)を実装(オーバーライド)します。
4.JTreeのgetToolTipLocation(MouseEvent event)を実装(オーバーライド)します。(new!!)


import java.awt.Component;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTree;
import javax.swing.ToolTipManager;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.TreeCellRenderer;
import javax.swing.tree.TreePath;


public class JTreeHintTest2 {

/**
* @param args
*/
public static void main(String[] args) {
JFrame f = new JFrame();
f.setSize(200, 200);
JTree t = new MyTree2();
ToolTipManager.sharedInstance().registerComponent(t); // 1.JTreeをツールチップマネージャーに登録します。
t.setCellRenderer(new MyRendrer2()); // 2.セルレンダラを設定します。
f.add(t);
f.setVisible(true);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
class MyRendrer2 extends DefaultTreeCellRenderer {
// 3.セルレンダラのgetToolTipText(MouseEvent event)を実装します。
@Override
public String getToolTipText(MouseEvent event) {
return getText();
}
}

class MyTree2 extends JTree {
// 4.JTreeのgetToolTipLocation(MouseEvent event)を実装(オーバーライド)します。
@Override
public Point getToolTipLocation(MouseEvent event) {
Point p = null;
if(event != null) {
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 TreeCellRenderer) {
JLabel r2 = (JLabel)rComponent;
Rectangle pathBounds = getPathBounds(path);
int iconWidth = r2.getIcon().getIconWidth();
p = new Point(pathBounds.x + iconWidth, pathBounds.y);
}
}
}
return p;
}
}



■ 解説
1.JTreeをツールチップマネージャーに登録します。
ヒントを表示するには、まずツールチップマネージャーにコンポーネントを登録する必要があります。

2.セルレンダラを設定します。
ヒントに表示する文字列は、セルレンダラのgetToolTipText(MouseEvent event)から取得されます。
よって、getToolTipText(MouseEvent event)を実装したセルレンダラをJTreeに設定する必要があります。

3.セルレンダラのgetToolTipText(MouseEvent event)を実装します。
2.と同じなので割愛。

4.JTreeのgetToolTipLocation(MouseEvent event)を実装(オーバーライド)します。
ヒントの表示位置は、JTreeのgetToolTipLocation(MouseEvent event)で設定します。

JTreeにはデフォルトの実装がありますが、これをオーバーライドして自分好みの座標に変換します。
今回のコードは、デフォルトの実装をコピペして改造した物です。

Rectangle pathBounds = getPathBounds(path);
int iconWidth = r2.getIcon().getIconWidth();
p = new Point(pathBounds.x + iconWidth, pathBounds.y);

アイテムの表示位置の端っこに、アイコンの幅だけ横にずらした座標を設定しています。

0 件のコメント: