JTextPane - skróty klawiszowe, KeyListenery

0

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ę.

0

Znalazłem rozwiązanie:

InputMap inputMapTextPane;
ActionMap actionMapTextPane;

(...)

inputMapTextPane = textPane.getInputMap();
actionMapTextPane = textPane.getActionMap();

KeyboardCtrlQ keyboardCtrlQ = new KeyboardCtrlQ();
inputMapTextPane.put(KeyStroke.getKeyStroke(KeyEvent.VK_Q, Event.CTRL_MASK, false), "ctrlq");
actionMapTextPane.put("ctrlq", keyboardCtrlQ);

(...)

final class KeyboardCtrlQ extends AbstractAction
{
	@Override
	public void actionPerformed(ActionEvent e)
	{
		JOptionPane.showMessageDialog(panelText, "Naciśnięto Ctrl+Q!");
	}
}

Wątek nieważny :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1