Я использую JPopupMenu в своем приложении в JTable:
public FilePopupMenu(JTable table) {
super();
this.table = table;
// Open File
JMenuItem open = new JMenuItem("Open file");
open.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, ActionEvent.CTRL_MASK));
open.addActionListener((ActionEvent e) -> {
try {
FileUtils.openFileInNotepad(FileUtils.buildXmlFilePath(selectedRow));
} catch (MyException e1) {
LOG.error("Error when opening file : " + selectedRow, e1);
}
});
this.add(open);
this.addPopupMenuListener(new PopupMenuListener() {
@Override
public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
FilePopupMenu popup = (FilePopupMenu) e.getSource();
int rowAtPoint = popup.getTable()
.rowAtPoint(SwingUtilities.convertPoint(popup, new Point(0,0), popup.getTable()));
if (rowAtPoint > -1) {
popup.getTable().setRowSelectionInterval(rowAtPoint, rowAtPoint);
@SuppressWarnings("unchecked")
Vector<String> selectedRow = (Vector<String>) ((FilePanelModel) popup.getTable()
.getModel()).getDataVector()
.get(popup.getTable().getRowSorter().convertRowIndexToModel(rowAtPoint));
popup.setSelectedRow(selectedRow);
}
}
});
}
});
}
Я добавил к нему несколько JMenuItem с Accelerator для каждого из них.
Но эти ускорители не работают, когда всплывающее менюневидимый.
Я пытался открыть меню с помощью ключевого слушателя, но оно появляется в левом верхнем углу экрана и не закрывается:
JPopupMenu popup = new FilePopupMenu(tableFiles);
tableFiles.setComponentPopupMenu(popup);
tableFiles.addKeyListener(new KeyListener() {
public void keyReleased(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_CONTROL) {
popup.setVisible(true);
}
}
});
Я думаю о создании JMenu, затем добавляюэто к строке меню, чтобы заставить это работать.
Любая другая идея?