Java: Use keystroke with arrow key
Solution 1
Do start the program by pressing the DOWN ARROW KEY
, to watch the string first. Here have a look at this example program :
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class KeyBindingExample
{
private void createAndDisplayGUI()
{
JFrame frame = new JFrame("Key Binding Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
DrawingPanel contentPane = new DrawingPanel();
frame.setContentPane(contentPane);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
contentPane.requestFocusInWindow();
}
public static void main(String... args)
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
new KeyBindingExample().createAndDisplayGUI();
}
});
}
}
class DrawingPanel extends JPanel
{
private int x;
private int y;
private String[] commands = {
"UP",
"DOWN",
"LEFT",
"RIGHT"
};
private ActionListener panelAction = new ActionListener()
{
@Override
public void actionPerformed(ActionEvent ae)
{
String command = (String) ae.getActionCommand();
if (command.equals(commands[0]))
y -= 1;
else if (command.equals(commands[1]))
y += 1;
else if (command.equals(commands[2]))
x -= 1;
else if (command.equals(commands[3]))
x += 1;
repaint();
}
};
public DrawingPanel()
{
x = 0;
y = 0;
for (int i = 0; i < commands.length; i++)
registerKeyboardAction(panelAction,
commands[i],
KeyStroke.getKeyStroke(commands[i]),
JComponent.WHEN_IN_FOCUSED_WINDOW);
}
@Override
public Dimension getPreferredSize()
{
return (new Dimension(500, 300));
}
@Override
public void paintComponent(Graphics g)
{
super.paintComponent(g);
String displayText = "X : " + x + " and Y : " + y;
System.out.println(displayText);
g.drawString(displayText, x, y);
}
}
Solution 2
You should be able to use KeyStroke.getKeyStroke("DOWN");
, "UP"
, "LEFT"
, "RIGHT"
, to do what you want.
See the javadoc for more detail.
hqt
Those who don't speak math are doomed to speak nonsense. My brief profile: https://github.com/hqt/profile
Updated on June 16, 2022Comments
-
hqt almost 2 years
I have some code that I need to modify. In the code, the original author uses
KeyStroke.getKeyStroke
to take user input. In this code, for example, he usesa
instead of left arrow.I want to change this, but I don't know how.
Here is the original code:
registerKeyboardAction( new ActionListener() { public void actionPerformed(ActionEvent e) { tick(RIGHT); } }, "right", KeyStroke.getKeyStroke('d'), WHEN_IN_FOCUSED_WINDOW );
I have to change it to something like this, but when run, it doesn't work:
KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT);
KeyStroke.getKeyStroke("RIGHT");