I have a subclass PointPanel
of JPanel
, where I want to implement the following behavior: If the mouse hovers the instance and the shift key is pressed, the mouse cursor changes to the hand cursor; if the shift key is released, the mouse cursor changes back to the default cursor.
In order to achieve this, I tried to add a KeyListener
in the constructor:
this.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_SHIFT) {
System.out.println("Shift pressed");
PointPanel.this.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
}
}
@Override
public void keyReleased(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_SHIFT) {
System.out.println("Shift released");
PointPanel.this.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
}
}
});
This approach does not work.
The window which contains this panel should have the focus since it is the only visible window of the application.
What do I miss?
CodePudding user response:
I found it confusing when creating the KeyStroke.
For the pressed I had to use:
KeyStroke pressed = KeyStroke.getKeyStroke("shift pressed SHIFT");
But for the released I could use either:
KeyStroke released = KeyStroke.getKeyStroke("released SHIFT");
KeyStroke released = KeyStroke.getKeyStroke(KeyEvent.VK_SHIFT, 0, true);
And I used:
InputMap im = getInputMap(JPanel.WHEN_IN_FOCUSED_WINDOW);