2011-11-10 14 views
1

JTreeを使用して、すべての親ノードと子ノードに対して異なるドロップダウンを実装しようとしています。ここでノードを右クリックするとJTreeとドロップダウンオプションが表示される

は、私がやったものだ:

pmTree.addMouseListener(new java.awt.event.MouseAdapter() { 
     @Override 
     public void mouseClicked(java.awt.event.MouseEvent evt) { 
      try { 
      if(evt.getButton() == evt.BUTTON1) { 
      } 
      else if (evt.getButton() == evt.BUTTON3) { 
       TreePopup(evt); 
       //pmTree.updateUI(); 
      } 
      }catch (Exception e) {} 
     } 
    }); 

とPopupCode:

public void TreePopup(java.awt.event.MouseEvent evt) { 
    DefaultMutableTreeNode node = (DefaultMutableTreeNode) pmTree.getLastSelectedPathComponent(); 
    popup = new JPopupMenu(); 
    popup.setInvoker(pmTree); 
    PopupHandler handler = new PopupHandler(pmTree, popup); 
    if(node.getLevel() == 1) 
    { 
     popup.add(getMenuItem("Parent Node", handler)); 
    } 
    else if(node.getLevel() == 2) 
    { 
     popup.add(getMenuItem("Child", handler)); 
    } 
    } 

とPopUpHandler:

public class PopupHandler extends javax.swing.JFrame implements ActionListener { 
JPopupMenu popup; 
Point loc; 

public PopupHandler(JTree tree, JPopupMenu popup) { 
    //this.tree = NewJFrame.pmTree; 
    this.popup = popup; 
    tree.addMouseListener(ma); 
} 

とも

public void actionPerformed(java.awt.event.ActionEvent evt) 
子ノードまたは親ノードがクリックされた場合は

です。

しかし、プログラムを実行すると、子ノードと親ノードの両方に対してSAME右クリックポップアップが表示されます。

大変申し訳ありません。私は2日間それに固執したが、まだ成功していない。 ありがとう!

答えて

2

あなたは、選択したノードチェック:あなたが「親」または「子」ノードを持っているかどうかを確認するために

DefaultMutableTreeNode node = (DefaultMutableTreeNode)pmTree.getLastSelectedPathComponent(); 

を。最初にマウスの位置でノードを選択する必要があります。そうでない場合は、正しいノードではありません。

TreePath path = pmTree.getPathForLocation(evt.getX(), evt.getY()); 
if (path != null) { 
    pmTree.setSelectionPath(path); 
} else { 
    return; 
} 

treePopupの冒頭に電話してください。 (Javaのメソッドは、小文字で始まる必要があります)

+0

なし - 行儀の良いUIの選択にはポップアップとは無関係な、私は同意 – kleopatra

+0

@kleopatraをトリガし、右クリック(ポップアップ・トリガー)は、通常選択されます。たとえば、Windowsエクスプローラを見てください。 –

+0

あなたは正しいと判断されました。それは不思議なことですが、私はSwingチームとの激しい議論を、右クリックで選択しないように強く覚えています。だから、その時(咳...もう少し前に)私は勝利を選択しなかったと思います。ヘッドアップをありがとう! – kleopatra

3

MouseListenerとして低レベルにするのではなく、componentPopupMenuの周りにapiを使用してください。そう、一般的なアプローチは、動的getPopupLocation方法でcomponentPopupを設定され、いくつかの簡単な例では、スニペット:

JPopupMenu popup = new JPopupMenu(); 
    final Action action = new AbstractAction("empty") { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      // TODO Auto-generated method stub 
     } 
    }; 
    popup.add(action); 
    JTree tree = new JTree() { 

     /** 
     * @inherited <p> 
     */ 
     @Override 
     public Point getPopupLocation(MouseEvent e) { 
      if (e != null) { 
       // here do your custom config, like f.i add/remove menu items based on context 
       // this example simply changes the action name 
       TreePath path = getClosestPathForLocation(e.getX(), e.getY()); 
       action.putValue(Action.NAME, String.valueOf(path.getLastPathComponent())); 
       return e.getPoint(); 
      } 
      action.putValue(Action.NAME, "no mouse"); 
      return null; 
     } 

    }; 
    tree.setComponentPopupMenu(popup); 
1

恐ろしいです。 のオーバーライド内でsetSelectionPath()コールを成功させることができました。私はJMenuItemActionListenerの中でそれをしようとしていたが役に立たなかった。

public Point getPopupLocation(MouseEvent e) { 
    Point point = null; 
    if(e != null) { 
     TreePath path = getClosestPathForLocation(e.getX(), e.getY()); 
     setSelectionPath(path); 
     point = e.getPoint(); 
    } 
    return point; 
} 
関連する問題