ショート:セル行を強調表示するには、「右クリックイベント」が必要です。
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()関数を探しましたが、適切な関数が見つかりませんでした。デフォルトでは、左クリックすると自動的に行が強調表示されます。右クリック用に設定するにはどうすればよいですか?
このような:
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());
}
}
});
…….
受け入れられた回答は修飾キーを取りません ctrl または shift ただし、現在の選択範囲は置き換えられない必要がありますが、拡張する必要があることを示しています。
また、mousePressed
およびmouseReleased
をチェックして、マルチOSサポートを追加しました。
次に、 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);
}
});