4

JTableを右クリックするとポップアップメニューが作成される状況があります。ポップアップメニューを作成する標準的な方法:

aJTable.setComponentPopupMenu(rightClickMenu);

その後、登録されたアクションで、ポップアップメニューを表示するために右クリックされたセルを見つけることができません。

rightClickMenuItem.addActionListener(new AbstractAction() {
    @Override
    public void actionPerformed(ActionEvent e) {
        // Work out what cell was right clicked to generate the menu
    }

});

これをどのように行うかについてのアイデアはありますか?

4

3 に答える 3

5

驚くべき事実:componentPopupMenuがインストールされていると、mouseListenerはpopupTriggerであるmouseEventを認識しません(その理由は、componentPopupの表示がBasicLookAndFeelによってインストールされたAWTEventListenerによってグローバルに処理され、そのリスナーがイベントを消費するためです)。

そのトリガーのmousePositionを見る唯一の場所はgetPopupLocation(MouseEvent)であるため、(場所に依存する構成/アクションを実行するために)それを保持する唯一の信頼できる方法は、そのメソッドをオーバーライドして値をどこかに保存するという@Madの提案です。後で使用します。

以下のスニペットは、保存場所としてclientPropertyを使用しています。

final JTable table = new JTable(new AncientSwingTeam()) {

    @Override
    public Point getPopupLocation(MouseEvent event) {
        setPopupTriggerLocation(event);
        return super.getPopupLocation(event);
    }

    protected void setPopupTriggerLocation(MouseEvent event) {
        putClientProperty("popupTriggerLocation", 
                event != null ? event.getPoint() : null);
    }
};
JPopupMenu popup = new JPopupMenu();
Action action = new AbstractAction("show trigger location") {

    @Override
    public void actionPerformed(ActionEvent e) {
        JPopupMenu parent = (JPopupMenu) SwingUtilities.getAncestorOfClass(
                JPopupMenu.class, (Component) e.getSource());
        JTable invoker = (JTable) parent.getInvoker();
        Point p = (Point) invoker.getClientProperty("popupTriggerLocation");
        String output = p != null ? "row/col: " 
             + invoker.rowAtPoint(p) + "/" + invoker.columnAtPoint(p) : null; 
        System.out.println(output);
    }
};
popup.add(action);
popup.add("dummy2");
table.setComponentPopupMenu(popup);
于 2013-06-26T09:53:04.090 に答える
3

@MadProgrammerのgetPopupLocationの提案は有望に見えましたが、テーブルとactionEventの間で情報を取得する方法を理解できませんでした...

これを回避するには、右クリックしたときに行が選択されていることを確認します->ポップアップメニューでは行が選択されないため、マウスリスナーを追加して、クリックしても行が選択されるようにすることができます(左または右)を押します。

aTable.addMouseListener(new MouseAdapter() {
    @Override
    public void mousePressed(MouseEvent e) {
        int r = aTable.rowAtPoint(e.getPoint());
        if (r >= 0 && r < clt.getRowCount()) {
            aTable.setRowSelectionInterval(r, r);
        } else {
            aTable.clearSelection();
        }
    }
});

これは、rightClickMenuItemのアクションリスナーで、テーブルの選択されたセル/行を取得できることを意味します

rightClickMenuItem.addActionListener(new AbstractAction() {
    @Override
    public void actionPerformed(ActionEvent e) {
        aTable.get details about the selected one....
    }
});

簡単すぎる!助けてくれてありがとう。

于 2012-12-12T03:38:36.650 に答える
0

JTableにはメソッドがあります

int row = rowAtPoint(p);
int col = columnAtPoint(p);

したがって、MouseEventのポイントを渡し、値を使用します

を追加しMouseListener、最後の右クリックポイントをどこかに保存します。

于 2012-12-11T08:08:12.173 に答える