• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:JTreeの+-ボタンについて)

JTreeの+-ボタンについて

このQ&Aのポイント
  • JTreeを使ってウィンドウズエクスプローラーのようなものを作りたいと思っています。ノードのテキスト内をクリックしないと選択されませんが、エクスプローラーのツリーはそのノードと同じ高さであればどこをクリックしても選択になります。
  • 以下のコードを書いてみましたが、ツリーのノードの展開、非展開を切り替える+-のボタン?の動作が変になります。+-ボタン領域をクリックすると展開、非展開切り替えの後で改めてノードを選択、展開になります。+-ボタン領域をクリックした場合はノード選択の処理に入らないようにすれば良いと思いますが、+-ボタン領域の計算方法や取得方法が分かりません。
  • 他の良い方法を知っている方がいれば、教えてください。よろしくお願いします。

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

  • ベストアンサー
  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.1

私なら JTreeのNodeの横幅を大きくするような MyJTreeを作るとか考えてみるけど。 なんか無責任な回答になったわ。

hdnssd
質問者

お礼

ノードを大きくするのは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());     }    }  });

関連するQ&A