6

JTable と、各行に固有のポップアップ メニューがあります。ユーザーがマウス (Windows L&F) を右クリックしてポップアップ メニューを表示した行を計算したいと考えています。

テーブルの MouseListener を作成して、クリック時に MouseEvent を取得し、正しい場所にポップアップ メニューを表示します。しかし、ユーザーがポップアップ メニューから 1 つの項目を選択すると、ユーザーが最初に右クリックした行が何であったかを判断する方法がわかりません。ポップアップ メニュー呼び出しのイベントには、右クリックが行われた場所の x、y 座標がありません。

ポップアップの位置を取得することを見てきましたが、それはテーブルではなくフレームに属しているため、それもその親も、必要な正しい x、y 値を持っていません。

JPopupMenu をサブクラス化し、MouseListener に必要な x 値と y 値を設定することで、この問題を回避しました。しかし、これは JTable にポップアップ メニューを配置したい人にとって一般的な問題であるように思えます。

これを行う簡単な方法、特に JPopupMenu のサブクラス化を伴わない方法はありますか?

4

2 に答える 2

14
JTable.rowAtPoint(...);

ポイントは MouseEvent から取得できます。

編集:

table.addMouseListener( new MouseAdapter()
{
    public void mouseReleased(MouseEvent e)
    {
        if (e.isPopupTrigger())
        {
            JTable source = (JTable)e.getSource();
            int row = source.rowAtPoint( e.getPoint() );
            int column = source.columnAtPoint( e.getPoint() );

            if (! source.isRowSelected(row))
                source.changeSelection(row, column, false, false);

            popup.show(e.getComponent(), e.getX(), e.getY());
        }
    }
});
于 2010-11-08T02:35:35.927 に答える
2

右ボタン クリックで行を選択してもかまわない場合は、MouseListener でJTable.rowAtPoint()を使用し、選択されていない場合は行を選択し、ポップアップ リスナーでJTable.getSelectedRows()を使用して行を処理します。または、ポップアップ メニュー リスナーからアクセスできる別のデータ構造に保存することもできます。

于 2010-11-08T07:51:25.690 に答える