В принятом ответе не принимаются ключи-модификаторы, такие как ctrl или shift, но они указывают, что текущий выбор должен быть заменен не , но расширен.
Кроме того, я добавлена поддержка нескольких ОС, проверив mousePressed
и 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);
}
});
Просто обновите свою версию Node.js. Смотровые утверждения являются частью ECMAScript 2018 и уже реализованы в Chromium и Node.js. Согласно http://kangax.github.io/compat-table/es2016plus/ , Chromium 70 и Node.js 8.10 имеют эту функцию.
Я только что проверил это в своем браузере и в Node.js (v8.11) и могу подтвердить, что:
node -e "console.log('nothing@xyz, bla'.match(/(?<=@[A-Za-z]+,)\s+/))"
Если вы не можете обновить, вы должны использовать другие стратегии, такие как захват и замена. что не должно быть большой проблемой с положительным взглядом сзади (негативы сложнее):
const hit = 'nothing@xyz, bla'.match(/(@[A-Za-z]+,)\s+/)
hit[0].replace(hit[1])
Если ничего не работает, взгляните на этот проект, который пытается реализовать Lookbehind (я не проверял его) : http://blog.stevenlevithan.com/archives/javascript-regex-lookbehind
Что вам нужно сделать, так это преобразовать lookbehinds в группы захвата, чтобы включить их в строку замены (обратите внимание, что установлен регистрозависимый флаг (i
)):
(@[a-z]+,)([\t ]*([a-z]+)[\t ]*(?=\[[a-z]+\])|[\t ]+)
Заменить на [ 112], если вы хотите удалить эти пробелы.
См. живое демо здесь
.