我不能移动我的JLabel键绑定?

问题描述:

我想在Java中制作一个游戏,按空格键移动窗口中的框。我正在使用密钥绑定来完成此任务。问题是我无法弄清楚如何在盒子本身上使用ActionListener,这是一个JLabel。这是下面的代码:我不能移动我的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,而是与工作,但我发现,“空格键”,当我点击框本身只是打印出来。任何帮助是极大的赞赏。谢谢!

+0

而不是延长'AbstractAction'实现'KeyListener' [遵循这个(http://stackoverflow.com/questions/2077168/moving-jlabel-with-arrow -key) –

+0

@jackjay KeyBindings不会像KeyListener那样受到与焦点相关的问题的困扰,因为KeyListener可以应用于其他输入方法,它代表了一个可重用的工作函数,它更可能是布局问题 – MadProgrammer

+0

@MadProgrammer谢谢。但是,由于OP表示OP在点击标签时输出即将到来,所以我认为这可能是焦点问题。 –

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

我还suggestsomething更像box.getInputMap(WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0), "doPlayerAction"),作为KeyStroke用于分析String的机制KeyStroke更加复杂,那么它可能看起来,通常需要像pressedreleasedtyped更多的信息,它只是更容易使用虚拟键

我也将键绑定到gamePanel作为一般偏好,因为它应该是容器决定做什么的决定,但这只是我。

看一看How to Use Key Bindings更多细节

+0

修复它。谢啦!我一定会在这里遵循你的建议:) – SputnicK