• category: swing folder: TreeNodePopupMenu title: JTreeのノード上でJPopupMenuを表示 tags: [JTree, JPopupMenu, TreePath] author: aterai pubdate: 2009-06-01T15:04:19+09:00 description: JTreeのノード上でクリックした場合のみ、JPopupMenuを表示します。 image: https://lh6.googleusercontent.com/_9Z4BYR88imo/TQTWLWQUjBI/AAAAAAAAAo0/3F3RUbU5sx8/s800/TreeNodePopupMenu.png

概要

JTreeのノード上でクリックした場合のみ、JPopupMenuを表示します。

サンプルコード

#spandel
static class TreePopupMenu extends JPopupMenu {
#spanend
  private TreePath[] tsp;
  public TreePopupMenu() {
#spanadd
class TreePopupMenu extends JPopupMenu {
#spanend
  protected TreePopupMenu() {
    super();
    add(new AbstractAction("path") {
      @Override public void actionPerformed(ActionEvent e) {
        JOptionPane.showMessageDialog(
          null, tsp, "path", JOptionPane.INFORMATION_MESSAGE);
      }
    add("path").addActionListener(e -> {
      JTree tree = (JTree) getInvoker();
      JOptionPane.showMessageDialog(
        tree, tree.getSelectionPaths(), "path",
        JOptionPane.INFORMATION_MESSAGE);
    });
    add(new JMenuItem("dummy"));
    add("JMenuItem");
  }
#spanadd

#spanend
  @Override public void show(Component c, int x, int y) {
    JTree tree = (JTree) c;
    tsp = tree.getSelectionPaths();
    TreePath path = tree.getPathForLocation(x, y);
    if (path != null && Arrays.asList(tsp).contains(path)) {
      super.show(c, x, y);
    if (c instanceof JTree) {
      JTree tree = (JTree) c;
      TreePath path = tree.getPathForLocation(x, y);
      if (tree.getSelectionCount() > 0
          && Arrays.asList(tree.getSelectionPaths()).contains(path)) {
        super.show(c, x, y);
      }
    }
  }
}
View in GitHub: Java, Kotlin

解説

上記のサンプルでは以下の場合、JPopupMenuを表示しています。 上記のサンプルでは、JTreeのノードが選択されている、かつ選択されたノード上にカーソルがある場合のみJPopupMenuを表示可能に設定しています。
  • JTreeのノードが選択されている
  • 選択されたノード上にカーソルがある

参考リンク

コメント