Mnemonic / Accelerator для JPopupMenu - PullRequest
       36

Mnemonic / Accelerator для JPopupMenu

0 голосов
/ 12 октября 2018

Я использую 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, затем добавляюэто к строке меню, чтобы заставить это работать.
Любая другая идея?

...