JavaでJTreeの各ノードに右クリックメニューを実装する方法
JTreeはJComponentクラスのサブクラスであり、階層構造を持つデータを表示するために使用されるコンポーネントです。ノードの中にさらにノードを追加することで親子関係を表現でき、ツリー内の各要素が1つのノードとして扱われます。また、各ノードは展開・折りたたみ可能です。
JTreeの各ノードに対してマウスの右クリック操作を実装するには、MouseAdapterクラスのmouseReleased()メソッドを使用します。さらに、JPopupMenuクラスのshow()メソッドを呼び出すことで、クリックされたツリーノード上にポップアップメニューを表示できます。
実装例
以下のコードでは、ツリー上で右クリックすると「Delete(削除)」と「Add(追加)」の項目を含むポップアップメニューが表示されるようにしています。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.tree.*;
public class JTreeRightClickTest extends JFrame {
public JTreeRightClickTest() {
DefaultMutableTreeNode root = createNodes();
JTree tree = new JTree(root);
final TreePopup treePopup = new TreePopup(tree);
tree.addMouseListener(new MouseAdapter() {
public void mouseReleased(MouseEvent e) {
if(e.isPopupTrigger()) {
treePopup.show(e.getComponent(), e.getX(), e.getY());
}
}
});
add(new JScrollPane(tree), BorderLayout.NORTH);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(400, 300);
setLocationRelativeTo(null);
setVisible(true);
}
public static DefaultMutableTreeNode createNodes() {
DefaultMutableTreeNode root = new DefaultMutableTreeNode("Technology");
DefaultMutableTreeNode node1 = new DefaultMutableTreeNode("Java");
DefaultMutableTreeNode node2 = new DefaultMutableTreeNode("Python");
DefaultMutableTreeNode node3 = new DefaultMutableTreeNode("Selenium");
node1.add(new DefaultMutableTreeNode("Programming Language"));
node2.add(new DefaultMutableTreeNode("Programming Language"));
node3.add(new DefaultMutableTreeNode("Testing Framework"));
root.add(node1);
root.add(node2);
root.add(node3);
return root;
}
public static void main(String args[]) {
new JTreeRightClickTest();
}
}
class TreePopup extends JPopupMenu {
public TreePopup(JTree tree) {
JMenuItem delete = new JMenuItem("Delete");
JMenuItem add = new JMenuItem("Add");
delete.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
System.out.println("Delete child");
}
});
add.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
System.out.println("Add child");
}
});
add(delete);
add(new JSeparator());
add(add);
}
}
実行結果
このプログラムを実行すると、「Technology」をルートとする階層ツリーが表示され、任意のノード上で右クリックするとポップアップメニューが現れます。

ポイント解説
- isPopupTrigger():マウスイベントがポップアップメニューのトリガーかどうかを判定します。OSによって右クリックの挙動が異なるため、このメソッドを使うことでクロスプラットフォーム対応になります。
- TreePopupクラス:JPopupMenuを継承した独自クラスで、メニュー項目とアクションリスナーをまとめて管理しています。
- show()メソッド:第1引数にコンポーネント、第2・第3引数に表示位置の座標を指定することで、マウスカーソルの位置にメニューを表示します。
-
JavaでJPanelのpaintComponent()メソッドを実装する方法をわかりやすく解説
JPanelはJavaにおける軽量コンテナであり、それ自体は不可視(インビジブル)なコンポーネントとして扱われます。デフォルトのレイアウトにはFlowLayoutが採用されています。JPanelを生成した後は、Containerクラスから継承されたadd()メソッドを呼び出すことで、ボタンやラベルなどの他のコンポーネントをJPanelオブジェクトに自由に追加できます。 paintComponent()メソッドとは このメソッドは、単なる背景色の描画にとどまらず、JPanel上に独自の図形や画像などを描画したい場合に必要となります。paintComponent()メソッドはすでにJPanelクラ
-
JavaのJToggleButton実装ガイド:ON/OFF切替ボタンの作り方を解説
JToggleButtonとは JToggleButtonはAbstractButtonを拡張したクラスで、クリックするたびにONとOFFが切り替わるトグルボタンを実現するために使用されます。通常のボタンと異なり、押した状態を保持できるのが特徴です。 JToggleButtonの主な特徴 最初に押されたときは押し込まれた状態のままとなり、もう一度押してはじめて元の状態(押されていない状態)に戻ります。 ボタンが押されるたびにActionEventが発生します。 さらに、JToggleButtonはItemEventも発生させることができます。このイベントは、選択状態という概念を持つコンポー