ポップアップメニューを表示する マウスクリックのイベント

普段使うソフトのほとんどにポップアップメニュー(右クリックメニュー)が実装されていますね
これがあるだけで機能的なソフトに見えてきます
netbeansのデザイン画面で、パレットにポップアップメニューがあるから簡単に追加できると思ってたのですがいまいちよくわかりません。まぁ機能の特性上自分で書かなければならないことが多いので、最初から書いても手間はそう変わらないようです

実装の手順としては、メニュー項目を作りそれにリスナーを登録し、メニューに入れる感じです。
まずはメニューを作る作業。これだけでは右クリックしても何も起きません
いつもの例で、複数選択した行を削除する処理をメニューに入れます

    private JPopupMenu tablePopupMenu() {
        JPopupMenu pm = new JPopupMenu();
        JMenuItem item;
    //ここから
        item = new JMenuItem();
        item.addActionListener(new ActionListener() { 
            @Override
            public void actionPerformed(ActionEvent e) {
                int rows[] = table.getSelectedRows();
                //int column = table.getSelectedColumn();
                for (int i = 0; i < rows.length; i++) {
                    books.remove(rows[i]);
                }
                writeTable();
            }
        });
        item.setText("削除");
        pm.add(item);
    //ここまででひとつの項目
    //繰り返して項目を増やしていく
        return pm;
    }


ちょっと初見だとわかりにくい事だらけ。
1.メニューを表示したいところでダラダラ書くと醜くなるのでJPopupMenuを返す関数ということにしてます
2.pmというのがメニューになります
3.itemはメニューに入る項目です。この2変数は使いまわすためnewはここではしません
5.itemを作ります
6.itemにこの項目が実行された時の動作を登録します。引数であるアクションリスナーを事前に作っておくのでなくここで作るという力技です。こういうのはカッコが多くなって見にくいので嫌いです
・getSelectedRows()というのは、表の複数選択された行の番号をint[]に入れたものを返す関数です。
・今までの例ではセル選択が出来ない、行選択の仕様なので選択列は取得していません
・remove(rows[i])で本のリストから、選択行に対応した番号の本を削除します。本のリストをきれいに作ってこの関数を前もって作っていた恩恵がこのスッキリ感です
17.メニュー項目のテキストを設定します
18.ここまででitemは完成なのでメニューに加えます
20.ここまでで1項目です。これを動作部分を変えて繰り返せば複数項目になります
21.できあがったメニューを返します

メニューを作る関数が出来上がったら次は実装です。メニューを追加したいコンポーネントのイベントMouseClickedをいつもの手順で作って

    private void tableMouseClicked(java.awt.event.MouseEvent evt) {                                   
        if (table.isEditing()) {
            table.getCellEditor().stopCellEditing();
        }
        if (SwingUtilities.isRightMouseButton(evt)) {
            JPopupMenu popup = tablePopupMenu();
            popup.show(evt.getComponent(), evt.getX(), evt.getY());
        }
    }              


1.ここはnetbeansさんが書いてくれる部分です
2.セルが編集中だったら編集を終らせておきます。
4.右クリックされたかを判断します。MouseClickedのイベントはマウスのどのボタンかを判別してくれないからです
5.先程の関数でメニューを作ります
6.このメニューを表示します。他の場所をクリックしても表示されたままになるということはないのでこれだけで大丈夫です