Câu trả lời được chấp nhận không lấy chìa khóa modifier như ctrl hay thay đổi vào tài khoản, tuy nhiên họ chỉ ra rằng các lựa chọn hiện tại nên không được thay thế, nhưng được mở rộng.
Ngoài ra, tôi đã thêm hỗ trợ đa hệ điều hành bằng cách kiểm tra mousePressed
vàmouseReleased
.
Sau đây, bạn có thể tìm thấy ví dụ hoàn chỉnh về cách điều chỉnh các hàng đã chọn, sử dụng ListSelectionModel
, bao gồm séc MouseEvent#getModifiers
. Sau đó, bạn có thể mở một (tùy chọn) 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);
}
});
Nguồn
2016-08-01 16:42:36
Giống như vậy:] ... nửa trên của con chuộtĐược phát hành() là những gì tôi cần. Sẽ được bình chọn lên + chấp nhận làm câu trả lời. Cảm ơn, bạn là người đàn ông (hoặc phụ nữ)! –
Câu trả lời hay. Chi tiết: trên một số nền tảng (Mac OS X đặt tên cho nó), trình đơn bật lên được kích hoạt bởi 'mousePressed' thay vì 'mouseReleased' vì vậy nếu bạn sử dụng mã này, cửa sổ bật lên sẽ không hiển thị nếu bạn chạy ứng dụng của mình trên Mac OS X. – gabuzo
Mục đích của việc lấy rowIndex hai lần là gì? Ý tôi là, sự khác nhau giữa * r * và * rowindex * là gì? –