gpt4 book ai didi

java - 我无法使用按键绑定(bind)移动我的 JLabel?

转载 作者:行者123 更新时间:2023-12-01 20:57:06 26 4
gpt4 key购买 nike

我正在尝试用 Java 制作一个游戏,其中按空格键会移动窗口中的框。我正在使用按键绑定(bind)来完成此任务。问题是我不知道如何在盒子本身(即 JLabel)上使用 ActionListener。下面是代码:

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 并使用它,但我发现只有当我单击框本身时才会打印“空格键”。任何帮助是极大的赞赏。谢谢!

最佳答案

你的“核心”问题围绕box.getInputMap() ,将其更改为类似 box.getInputMap(WHEN_IN_FOCUSED_WINDOW) 的内容这意味着只要窗口具有焦点,API 就会响应按键事件,而不管其他组件可能具有焦点。

我还建议更像 box.getInputMap(WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0), "doPlayerAction") ,作为 KeyStroke 的机制用于解析StringKeyStroke比看起来更复杂,通常需要额外的信息,如 pressed , releasedtyped ,使用虚拟键更容易

我还将按键绑定(bind)到 gamePanel作为一般偏好,因为它应该是容器决定要做什么,但这只是我。

看看How to Use Key Bindings了解更多详情

关于java - 我无法使用按键绑定(bind)移动我的 JLabel?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42173271/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com