• ベストアンサー
  • 暇なときにでも

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());   }  } });

共感・応援の気持ちを伝えよう!

  • 回答数1
  • 閲覧数323
  • ありがとう数1

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

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

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

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

  • jtreeのノードを右クリックで選択する方法

    JTreeを使ってノードを複数作成し、ノードごとに文字列を入れる。 右クリックを押すとポップアップメニューが表示され、"表示"というメニューアイテムだけ表示される。 メニューアイテムの"表示"を押すとjtreeの下に用意されたjlabelにノードに入れられている文字列が表示される。 といったプログラムを作成しているのですが現在ノードの選択は左クリックでしか行う事ができません。 各ノードの上で右クリックで押すとノードの選択とポップアップの表示を同時に行えるようにしたいのですが どのようにすれば実現できるのかわかりません。 よろしければどなたかご教授お願いします。

    • ベストアンサー
    • Java
  • JAVAのアプレットのアニメーションの質問

    javaのアプレットに関する質問なんですが、今次の条件でアニメーションを作っているんですが、どうしても解決できない問題があります。 赤い長方形が左から右に動いていくプログラムを作成する。 ・ 長方形が描画領域 の右端に消えると左端から再 度出現するようにせよ。 ・ Reverseと書かれたボタンを押すと長方形の進行方 向が左右反対になる。 ・ このとき、左右どちらの端に長方形が消えた場合も 反対端から長方形は出現する。 ・ 長方形をクリック(ボタン押下)すると長方形の色が 変化する。 ・ 赤い長方形であれば青に、青い長方形であれば赤 に変化する。 この条件でつくろうと思っているのですが、長方形をクリックしたときに、色の変化がどうしてもできません。どこに問題があるか分かりません。御教授お願いします。 import java.applet.Applet; import java.awt.Graphics; import java.awt.Color; import java.awt.Font; import java.awt.Button; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import java.awt.event.MouseListener; public class Report2 extends Applet implements Runnable,ActionListener,MouseListener{ int x=100; int y=50; int width=80; int height=120; int dir=-2; int w; int z; Button bt; boolean direction; boolean colorRed; public void actionPerformed(ActionEvent ae){ if(direction==true){ direction=false; } else{ direction=true; } } public void init(){ bt=new Button("Reverse"); add(bt); bt.addActionListener(this); Thread th; th =new Thread(this); th.start(); addMouseListener(this); } public void mouseClicked(MouseEvent e){ w=e.getX(); z=e.getY(); repaint(); if(e.getX()>=x && e.getX()<=x+width && e.getY()>=y && e.getY()<=y+height){ colorRed=!colorRed; } } public void mouseEntered(MouseEvent e){ } public void mouseExited(MouseEvent e){ } public void mouseReleased(MouseEvent e){ } public void mousePressed(MouseEvent e){ w=e.getX(); z=e.getY(); repaint(); if(e.getX()>=x && e.getX()<=x+width && e.getY()>=y && e.getY()<=y+height){ colorRed=!colorRed; } } public void run() { while(true){ x++; if(x==400){ x=-80; } if(direction==true){ x=x+dir; } else{ } repaint(); try{ Thread.sleep(30); } catch(InterruptedException e){} } } public void paint(Graphics g){ g.setColor(Color.white); g.fillRect(0,0,400,200); g.setColor(Color.red); g.fillRect(x,y,80,120); if(colorRed=true){ g.setColor(Color.red); } if(colorRed=false){ g.setColor(Color.blue); } g.fillRect(x,y,width,height); g.setColor(Color.black); g.fillRect(x,y,10,10); } }

    • ベストアンサー
    • Java
  • java リアルタイムでマウスの座標を取得したい

    マウスのリアルタイム座標を取得したいのですが、 以下のソースを作りました。 しかし、リアルタイムどころか、マウスをクリックしても座標が取得できません どこを修正すればいいのでしょうか? import java.applet.Applet; import java.awt.*; import java.awt.event.*; import java.awt.event.MouseEvent; import java.net.URL; import java.awt.Image; /*<applet code="applet001" width="640" height="480"></applet>*/ public class applet001 extends Applet implements MouseListener, MouseMotionListener { Dimension dim; int mouse_x, mouse_y; //アプレットの初期化時呼び出される public void init() { dim = getSize(); addMouseListener( this ); } public void update(Graphics g) //オーバーライドして最低限のことだけをする { paint(g); } public void paint(Graphics g) { g.drawString( "マウス:" + mouse_x + "," + mouse_y, 60, 120 ); g.fillOval(mouse_x,mouse_y,30,30); } // マウスの処理 public void mousePressed( MouseEvent e ) { mouse_x = e.getX(); mouse_y = e.getY(); } public void mouseClicked( MouseEvent e ) {} public void mouseReleased( MouseEvent e ) {} public void mouseEntered( MouseEvent e ) {} public void mouseDragged( MouseEvent e ) {} // public void mouseExited( MouseEvent e ) {} // public void mouseMoved( MouseEvent e ) { mouse_x = e.getX(); mouse_y = e.getY(); repaint(); } }

    • ベストアンサー
    • Java
  • バイナリーツリーのノードの数をリカージョンを使って数えるメソッド

    いつもお世話になっています。 リカージョンを使って、バイナリーツリーのノードの数を調べるメソッドを作っているんですが、 boolean isEmpty() ツリーのノードが0ならtrueを返す RecBinTree leftSubtree() ルートの左のサブツリーを返す RecBinTree reightSubtree() ルートの右のサブツリーを返す この3つのメソッドを使っていいのですが、 public static int numNodes( RecBinTree t){ int result; if( !t.isEmpty()){ ??? } return result; } この???部分をどのように埋めたら、resultに全てのノードの数が帰るようにできるでしょうか? きっと単純なコードなんだろうけど、なんだかさっぱりわからなくなってしまっています。 いってる意味が分からなかったらごめんなさい。 どなたか教えて頂けたら幸いです。私にはもう無理みたいなんで・・。よろしくお願いします。

    • ベストアンサー
    • Java
  • コマンドボタンによる一括制御

    VB6.0について質問です。 コマンドボタンをクリックすると一括選択でき もう一度クリックすると一括解除するような処理を行いたいのですが どのようにやればいいですか? 現在IF文でやっているのですがうまくいきません>< For a = 1 To spdlist.MaxRows spdlist.Row = a If spdlist.Text = 0 Then spdlist.Text = 1 ElseIf spdlist.Text = 1 Then spdlist2.Text = 0 End If Next これだと一括で解除するときにすべて選択されていないとおかしなことになります;;

  • javaのことで

    ---MainPanel.java--- import java.awt.Dimension; import java.awt.Graphics; import java.event.MouseEvent; import java.event.MouseListener; import javax.swing.JPanel; import java.util.Random; public class MainPanel extends JPanel implements MouseListener { public static final int WIDTH = 640; public static final int HEIGHT = 480; private static final int NUM_FILE = 4; private File[] file; private int prev; public MainPanel() { setPreferredSize(new Dimension(WIDTH, HEIGHT)); file = new File[NUM_FILE]; for (int i = 0; i < NUM_FILE; i++) { file[i] = new File(i, this); } select(); addMouseListener(this); } private void clear() { for (int i = 0; i < NUM_FILE; i++) { file[i].delete(); } } private boolean check(int a, int b) { return a == b || a == prev || b == prev; } private void select() { Random rand = new Random(); int a, b; do { a = rand.nextInt(NUM_FILE); b = rand.nextInt(NUM_FILE); } while (check(a, b)); file[a].set(0, 0); file[b].set(file[a].getX() + file[a].getWith() + File.SPACE, 0); } public void paintComponent(Graphics g) { super.paintComponent(g); for (int i = 0; i < NUM_FILE; i++) { if (file[i].isSelected()) { file[i].draw(g); } g.drawString("ファイル" + (i + 1) + " … " + file[i].getCnt(), 0, HEIGHT * 3 / 4 + i * 15); } } public void mouseClicked(MouseEvent e) { int x = e.getX(); int y = e.getY(); for (int i = 0; i < NUM_FILE; i++) { if (file[i].isSelected()) { // 表示されていて // 画像内なら if (x > file[i].getX() && x < file[i].getX() + file[i].getWidth() && y < file[i].getY() && y > file[i].getY() + file[i].getHeight()) { file[i].count(); prev = i; clear(); select(); break; } } } repaint(); } public void mousePressed(MouseEvent e) { } public void mouseReleased(MouseEvent e) { } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } } フレームを用意してMainPanelを付加し,pack();してください.

  • C++のプログラムが走りません。

    <<条件は以下です。>> データメンバ x:xの座標(ただし 0-1000とする) y:yの座標(ただし 0-1000とする) z:zの座標(ただし 0-1000とする) メンバ関数 void setX(int a): xの座標を設計する(範囲外の値は、error messageを出力する) void setY(int b): Yの座標を設計する(範囲外の値は、error messageを出力する) void setZ(int c) Zの座標を設計する(範囲外の値は、error messageを出力する) int getX(): Xの座標値を得る int getY(): Yの座標値を得る int getZ(): Zの座標値を得る << 不明な点は、 if文で、どう戻るかがわからないことと、 最後の結果表示の部分です。 以下が、作成したプログラムです。ネットで検索して類似しているプログラムを参考にしたんですが。 よろしくお願いします。>> #include <iostream> using namespace std; class Zahyou{ private: int getX();//Xの座標値を得る int getY();//Yの座標値を得る int getZ();//Zの座標値を得る int a,b,c; public: void setX(int a);//Xの座標を設計する void setY(int b);//Yの座標を設計する void setZ(int c);//Zの座標を設計する void show(); }; void Zahyou::show(){ cout << "The result is: (" << a << "," << b << "," << c << ")"; } void Zahyou::setX(int a){ cout << " Please Input X " << "\n "; cin >> a ; if(a < 0 && a > 1000){ cout << "The value of X is a mistake, Please input X again! " << " \n "; } } void Zahyou::setY(int b){ cout << "Please Input Y " << "\n "; cin >> b ; if(b < 0 && b > 1000){ cout << "The value of y is a mistake, Please input X again! " << " \n "; cin >> b ; } } void Zahyou::setZ(int c){ cout << " Please Input Z " << "\n "; cin >> c ; if(c < 0 && c > 1000){ cout << "The value of Z is a mistake, Please input X again! " << " \n "; cin >> c ; } } int main(){ Zahyou zahyou1; zahyou1.getX(); zahyou1.getY(); zahyou1.getZ(); zahyou1.show(); return 0; }

  • JAVAのテキストエリアを自由に着けたり外したい

    JAVAアプレットで 設置したテキストエリアを クリックすると外すようにしたい 以下のようにソースを組んだのですが クリックしても消えてくれませんどうしたらいいでしょうか import java.awt.*; import java.awt.event.*; import java.applet.*; import java.util.Calendar; import java.util.Date; public class Test01 extends Applet implements MouseListener { char mode = 0; //表示画面のモード //編集エリアの入力 TextArea textArea1; public void init() { addMouseListener(this); //Applet内のMouseイベント } public void paint(Graphics g){ textArea1 = new TextArea(); if(mode == 0) { this.remove(textArea1); } else if(mode == 1) { textArea1.setBounds(new Rectangle(10, 10, 250, 70)); this.add(textArea1); } } //Mouseがクリックされた public void mouseClicked(MouseEvent e){ int mx=e.getX(); //現在のMouseのx座標を取得 int my=e.getY(); //現在のMouseのy座標を取得 if(mode == 0) { mode = 1; } else if(mode == 1) { mode = 0; } repaint(); } //MouseはApplt内に入りました public void mouseEntered(MouseEvent e){ //repaint(); } //Mouseが外に出た public void mouseExited(MouseEvent e){ //repaint(); } //Mouseを押した public void mousePressed(MouseEvent e){ //repaint(); } //Mouseが離されました public void mouseReleased(MouseEvent e){ //repaint(); } }

    • ベストアンサー
    • Java
  • ペイントソフトを作っているのですが・・・

    簡単な絵を書くプログラムを下のようにつくりました。 こんなようなソースが公開されているサイトをご存知のかたは教えていただけないでしょうか?? おねがいします!! import java.awt.*; import java.awt.event.*; public class mouse5 extends Frame implements MouseListener , MouseMotionListener{ //グローバル変数 int x0,y0; Color objectColor = Color.red; //コンストラクタ public mouse5(){ setSize(400,300); //マウスイベント addMouseListener(this); addMouseMotionListener(this); addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } }); } //paint public void paint(Graphics g){ } //マウスが押されたら public void mousePressed(MouseEvent e){ //始点の座標 x0 = e.getX(); y0 = e.getY(); } //マウスが放されたら public void mouseReleased(MouseEvent e){ } //マウスがクリックされたら public void mouseClicked(MouseEvent e){ } //マウスが画面に入ったら public void mouseEntered(MouseEvent e){ } //マウスが画面から出たら public void mouseExited(MouseEvent e){ } //マウスがドラックされたら public void mouseDragged(MouseEvent e){ //線を引く Graphics g = getGraphics(); g.drawLine(x0,y0,e.getX(),e.getY()); g.dispose(); //次のために始点を更新 x0 = e.getX(); y0 = e.getY(); } //マウスが動いたら public void mouseMoved(MouseEvent e){ } //main public static void main(String[] args) { Frame w = new mouse5(); w.show(); } }

    • ベストアンサー
    • Java
  • エクスプローラーのツリー

    Windows XPのときはスタートボタンを右クリックし、表示されたアイコンの「エクスプローラー」をクリックすればツリー状に展開されたフォルダやファイルが参照できました。 ところがWindows7ではこの方法ではできません。 Windows7でツリー状に表示するにはどうすればよいでしょうか?