Cześć.
Nie mogę sobie poradzić z używaniem skrótow klawiszowych.
Mam kontrolkę JTextPane, chcę naciskając pojedyńcze klawisze (np. F1, F2, itp), oraz skróty klawiszowe (np. Ctrl+N, Ctrl+Shift+N itp.) wywołać jakieś funkcje.
Sposób pierwszy - naciśnięcie przycisku w menu JPopupMenu lub użycie przypisanego do menu skrótu:
textPane.addMouseListener(new MouseAdapter()
{
@Override
public void mouseClicked(MouseEvent e)
{
if (e.getButton() == MouseEvent.BUTTON3) // jeśli kliknięty RMB
{
textPane_mouseClicked(e);
}
}
});
private void textMain_mouseClicked(MouseEvent e)
{
contextMenuMain.show(e.getComponent(), e.getX(), e.getY());
}
menuItem.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent evt)
{
JakaśFunkcja();
}
});
Kliknięci i wywołanie funkcji działa bez problem używając powyższego kodu. Ale gdy do menu przypiszę skrót klawiszowy, to już nie działa:
menuItem = new JMenuItem("menuItem");
menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_M, ActionEvent.CTRL_MASK));
menuItem.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent evt)
{
JakaśFunkcja();
}
});
Sposób drugi - osobny skrót klawiszowy nie związany z żadnym menu
Tutaj, gdy chcę nacisnąć jeden klawisz, działa poprawnie. Wyświetla się okienko z napisem "Naciśnięto F1".
KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(new KeyEventDispatcher()
{
@Override
public boolean dispatchKeyEvent(KeyEvent e)
{
if(e.getID() == KeyEvent.KEY_PRESSED)
{
if(e.getKeyCode() == KeyEvent.VK_F1)
{
JOptionPane.showMessageDialog(panelText, "Naciśnięto F1");
};
}
return false;
}
});
Ale gdy chcę użyć skrótu klawiszowego, to już nie działa:
if(e.getKeyCode() == KeyEvent.VK_F1 && e.getKeyCode() == ActionEvent.CTRL_MASK)
Nie działa też coś takiego:
this.addKeyListener(new KeyListener()
{
@Override
public void keyPressed(KeyEvent e) {
if ((e.getKeyCode() == KeyEvent.VK_C) && ((e.getModifiers() & KeyEvent.CTRL_MASK) != 0))
{
JOptionPane.showMessageDialog(panelText, "Ctrl+Q pressed!");
}
}
@Override
public void keyTyped(KeyEvent e) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void keyReleased(KeyEvent e) {
throw new UnsupportedOperationException("Not supported yet.");
}
});
PYTANIE:
Czego użyć żeby poprawnie działały skróty klawiszowe w obrębie JTextPane, czy to naciśnięty jeden klawisz czy kombinacja dwóch/trzech?
Starałem się opisać to w miarę zrozumiale. Do końca nie kumam tych skrótów, te przykłady co znalazłem w necie to użyłem w kodzie, ale to nie działa o końca tak jak chcę.