33

短い:セル行を強調表示するには、「右クリックイベント」が必要です。

Java Swing(Netbeans Matisse)のScrollPane内でJTableを使用しています。JTableにMouseClickedイベントリスナーがあり、次のことを実行します。

if (evt.getButton() == java.awt.event.MouseEvent.BUTTON3) {
          System.out.println("Right Click");
          JPopUpMenu.show(myJTable, evt.getX(), evt.getY())
}

問題は...JTableを右クリックするたびに、行が強調表示されないことです(選択範囲を行のみに設定しました)。いくつかのsetSelected()関数を探しましたが、適切な関数が見つかりませんでした。デフォルトでは、左クリックすると行が自動的に強調表示されます。右クリック用に設定するにはどうすればよいですか?

4

3 に答える 3

89

このような:

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

        int rowindex = table.getSelectedRow();
        if (rowindex < 0)
            return;
        if (e.isPopupTrigger() && e.getComponent() instanceof JTable ) {
            JPopupMenu popup = createYourPopUp();
            popup.show(e.getComponent(), e.getX(), e.getY());
        }
    }
});

……

于 2010-08-24T15:50:19.470 に答える
3

受け入れられた回答は、修飾キーなどctrlshift考慮していませんが、現在の選択を置き換えるのではなく、拡張する必要があることを示しています

mousePressed また、 と をチェックし てマルチ OS サポートを追加しましmouseReleasedた。

以下に、チェックListSelectionModelを含む を使用して、選択した行を調整する方法の完全な例を示します。MouseEvent#getModifiersその後、 (オプション) を開くことができますJPopupMenu

JPopupMenu contextMenu = new JPopupMenu();
// ...
// add elements to the popup menu
// ...

table.addMouseListener(new MouseAdapter() {
  @Override
  public void mousePressed(MouseEvent e) {
    handleRowClick(e);
    if (e.isPopupTrigger()) {
      doPop(e);
    } else {
      hidePop();
    }
  }

  @Override
  public void mouseReleased(MouseEvent e) {
    if (e.isPopupTrigger()) {
      doPop(e);
    }
  }

  private void handleRowClick(MouseEvent e) {
    ListSelectionModel selectionModel = table.getSelectionModel();
    Point contextMenuOpenedAt = e.getPoint();
    int clickedRow = table.rowAtPoint(contextMenuOpenedAt);

    if (clickedRow < 0) {
      // No row selected
      selectionModel.clearSelection();
    } else {
      // Some row selected
      if ((e.getModifiers() & InputEvent.SHIFT_MASK) == InputEvent.SHIFT_MASK) {
        int maxSelect = selectionModel.getMaxSelectionIndex();

        if ((e.getModifiers() & InputEvent.CTRL_MASK) == InputEvent.CTRL_MASK) {
          // Shift + CTRL
          selectionModel.addSelectionInterval(maxSelect, clickedRow);
        } else {
          // Shift
          selectionModel.setSelectionInterval(maxSelect, clickedRow);
        }
      } else if ((e.getModifiers() & InputEvent.CTRL_MASK) == InputEvent.CTRL_MASK) {
        // CTRL
        selectionModel.addSelectionInterval(clickedRow, clickedRow);
      } else {
        // No modifier key pressed
        selectionModel.setSelectionInterval(clickedRow, clickedRow);
      }
    }
  }

  private void doPop(MouseEvent e) {
    if (table.getSelectedRowCount() == 0) {
      return;
    }
    contextMenu.setVisible(true);
    contextMenu.show(e.getComponent(), e.getX(), e.getY());
  }

  private void hidePop() {
    contextMenu.setVisible(false);
  }
});
于 2016-08-01T16:42:36.127 に答える
0

別の MouseEvent を作成できます (ここでの例は JTable サブクラスにあります。processMouseEvent()アクセスは保護されています。それ以外の場合はdispatchEvent()メソッドを使用できます)。選択の更新に修飾子を使用します。

addMouseListener(new MouseAdapter() {
    @Override public void mousePressed(MouseEvent e) { checkForPopupMenu(e); }
    @Override public void mouseReleased(MouseEvent e) { checkForPopupMenu(e); }
    private void checkForPopupMenu(MouseEvent e) {
        if (e.isPopupTrigger()) {
            processMouseEvent(new MouseEvent(e.getComponent(), e.getID(), e.getWhen(), e.getModifiersEx(), e.getX(), e.getY(), 1, false, MouseEvent.BUTTON1));
            if (getSelectedRowCount() != 0)
                popup.show(e.getComponent(), e.getX(), e.getY());
        }
    }
});
于 2022-02-04T19:10:20.337 に答える