こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

JTreeの+-ボタンについて

JTreeを使ってウィンドウズエクスプローラーのようなものを作りたいと思っています。
JTreeはノードのテキスト内をクリックしないと選択されませんが、エクスプローラーのツリーはそのノードと同じ高さであればどこをクリックしても選択になります。

それを再現しようと以下のコードを書いてみました。
しかしこれだとツリーのノードの展開、非展開を切り替える+-のボタン?の動作が変になります。
+-ボタン領域をクリックすると展開、非展開切り替えの後で改めてノードを選択、展開になります。
+-ボタン領域をクリックした場合はノード選択の処理に入らないようにすれば良いと思うのですがその+-ボタン領域の計算方法や取得方法が分かりません。

あるいはもっと良い方法を知っている方、是非教えてください。よろしくお願いします。

jTree.addMouseListener(new MouseAdapter() {
 public void mouseClicked(MouseEvent e) {
  int d = jTree.getRowBounds(0).getBounds().y;
  int row = jTree.getRowCount();
  int height = jTree.getRowHeight();
  int mouse = e.getY() + d;
  int selectrow = 0;
  if (height > 0) {
    selectrow = (int) (mouse / height);
  } else {
    selectrow = jTree.getRowForLocation(e.getX(), e.getY());
  }
  if (selectrow < row) {
    jTree.setSelectionRow(selectrow);
  }
  if (SwingUtilities.isRightMouseButton(e)) {
    jPopupMenu.show(e.getComponent(), e.getX(), e.getY());
  }
 }
});

投稿日時 - 2009-03-26 17:18:07

QNo.4828894

暇なときに回答ください

質問者が選んだベストアンサー

私なら
JTreeのNodeの横幅を大きくするような
MyJTreeを作るとか考えてみるけど。

なんか無責任な回答になったわ。

投稿日時 - 2009-03-27 12:14:43

お礼

ノードを大きくするのはDefaultTreeCellRendererのsetPreferredSizeとかMinimumSizeとかでサイズを設定すると出来たのですが、ノードを選択した際に背景の青も大きく表示されてしまったり横に広くなってスクロールバーが現れたり、、ちょっと出来なさそうだったのでその方法は諦めました。

もう一度JavaDocを見るとBasicTreeUIクラスに isLocationInExpandControl(TreePath path, int mouseX, int mouseY) というメソッドがありこれが正に+-ボタン領域かどうかを計算するメソッドでした。
ただprotectedで宣言されていたのでそのままでは使えず、迷った末にBasicTreeUIを拡張したMyTreeUIクラスを作って勝手にpublicメソッドに直して使いました。
またJTreeには指定したx,y座標に最も近いノードのパスを返すというメソッドもあったので最初より少しシンプルにできました^^
半分諦めかけてましたが出来て良かったです。ありがとうございました。

class MyTreeUI extends BasicTreeUI {
 public boolean isLocationInExpandControlPublic(TreePath path, int mouseX, int mouseY) {
  return this.isLocationInExpandControl(path, mouseX, mouseY);
 }
}
~~~
jTree.setUI( new MyTreeUI() );
 jTree.addMouseListener(new MouseAdapter() {
   public void mouseClicked(MouseEvent e) {
    int mouseX = e.getX();
    int mouseY = e.getY();
    MyTreeUI treeUI = (MyTreeUI) jTree.getUI();
    TreePath selectPath = jTree.getClosestPathForLocation(mouseX, mouseY);
    int treeHeight = jTree.getRowCount() * jTree.getRowHeight();
    
    if (0 < mouseY && mouseY < treeHeight
      && !(treeUI.isLocationInExpandControlPublic(selectPath, mouseX, mouseY))) {
     jTree.setSelectionPath(selectPath);
    }
    if (SwingUtilities.isRightMouseButton(e)) {
     jPopupMenu.show(e.getComponent(), e.getX(), e.getY());
    }
   }
 });

投稿日時 - 2009-03-27 15:22:46

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問