我不能用键绑定移动我的 JLabel 吗?
I can't move my JLabel with Key Binding?
我正在尝试在 Java 中制作一个游戏,其中按空格键会移动 window 中的框。我正在使用键绑定来完成此任务。问题是我不知道如何在盒子本身上使用 ActionListener,它是一个 JLabel。这是下面的代码:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
public class Game {
private static JFrame frame = new JFrame();
private static JPanel gamePanel = new JPanel();
private static Action playerAction = new PlayerListener();
private static JLabel box = new JLabel();
private static int x = 250;
private static int y = 250;
public static void main(String[] args) {
frame.add(boxPanel());
frame.setTitle("Block Game");
frame.setSize(500,500);
frame.setLocationRelativeTo(null);
frame.setFocusable(true);
box.addActionListener(playerAction);
frame.setVisible(true);
}
static JPanel boxPanel() {
ImageIcon boxIcon = new ImageIcon("box.png");
box.setIcon(boxIcon);
box.setSize(30,30);
box.setLocation(x,y);
box.getInputMap().put(KeyStroke.getKeyStroke("SPACE"), "doPlayerAction");
box.getActionMap().put("doPlayerAction", playerAction);
gamePanel.setLayout(null);
gamePanel.add(box);
frame.add(gamePanel);
return gamePanel;
}
static class PlayerListener extends AbstractAction {
public void actionPerformed(ActionEvent e) {
System.out.println("SPACEBAR");
}
}
}
我尝试将框更改为 JButton 并使用它,但我发现 "SPACEBAR" 仅在我单击框本身时打印出来。任何帮助是极大的赞赏。谢谢!
您的 "core" 问题围绕 box.getInputMap()
,将其更改为更类似于 box.getInputMap(WHEN_IN_FOCUSED_WINDOW)
的内容,这意味着 API 将在 window 有焦点,不管其他组件可能有焦点。
我还建议一些更像 box.getInputMap(WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0), "doPlayerAction")
的东西,因为 KeyStroke
用来将 String
解析为 KeyStroke
的机制比看起来更复杂,通常需要额外的信息,如 pressed
、released
或 typed
,使用虚拟键更容易
我也会将键绑定到 gamePanel
作为一般偏好,因为它应该是容器决定要做什么,但那只是我。
查看 How to Use Key Bindings 了解更多详情
我正在尝试在 Java 中制作一个游戏,其中按空格键会移动 window 中的框。我正在使用键绑定来完成此任务。问题是我不知道如何在盒子本身上使用 ActionListener,它是一个 JLabel。这是下面的代码:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
public class Game {
private static JFrame frame = new JFrame();
private static JPanel gamePanel = new JPanel();
private static Action playerAction = new PlayerListener();
private static JLabel box = new JLabel();
private static int x = 250;
private static int y = 250;
public static void main(String[] args) {
frame.add(boxPanel());
frame.setTitle("Block Game");
frame.setSize(500,500);
frame.setLocationRelativeTo(null);
frame.setFocusable(true);
box.addActionListener(playerAction);
frame.setVisible(true);
}
static JPanel boxPanel() {
ImageIcon boxIcon = new ImageIcon("box.png");
box.setIcon(boxIcon);
box.setSize(30,30);
box.setLocation(x,y);
box.getInputMap().put(KeyStroke.getKeyStroke("SPACE"), "doPlayerAction");
box.getActionMap().put("doPlayerAction", playerAction);
gamePanel.setLayout(null);
gamePanel.add(box);
frame.add(gamePanel);
return gamePanel;
}
static class PlayerListener extends AbstractAction {
public void actionPerformed(ActionEvent e) {
System.out.println("SPACEBAR");
}
}
}
我尝试将框更改为 JButton 并使用它,但我发现 "SPACEBAR" 仅在我单击框本身时打印出来。任何帮助是极大的赞赏。谢谢!
您的 "core" 问题围绕 box.getInputMap()
,将其更改为更类似于 box.getInputMap(WHEN_IN_FOCUSED_WINDOW)
的内容,这意味着 API 将在 window 有焦点,不管其他组件可能有焦点。
我还建议一些更像 box.getInputMap(WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0), "doPlayerAction")
的东西,因为 KeyStroke
用来将 String
解析为 KeyStroke
的机制比看起来更复杂,通常需要额外的信息,如 pressed
、released
或 typed
,使用虚拟键更容易
我也会将键绑定到 gamePanel
作为一般偏好,因为它应该是容器决定要做什么,但那只是我。
查看 How to Use Key Bindings 了解更多详情