Java 如何将空格键的actionListener实现为动作事件
我已经设置好了定时更新,但是我希望能够用空格键暂停定时器。我试图实现一个actionListener,但我不确定该应用于什么。我能找到的大多数示例都与按钮或文本框有关,而不是jpanel中的键盘按键。我已经将src打印到控制台,它似乎没有将我的空格键注册为事件。。。我已经尝试添加actionListener,但对语法没有任何了解。任何帮助都将不胜感激Java 如何将空格键的actionListener实现为动作事件,java,swing,keyboard,actionlistener,actionevent,Java,Swing,Keyboard,Actionlistener,Actionevent,我已经设置好了定时更新,但是我希望能够用空格键暂停定时器。我试图实现一个actionListener,但我不确定该应用于什么。我能找到的大多数示例都与按钮或文本框有关,而不是jpanel中的键盘按键。我已经将src打印到控制台,它似乎没有将我的空格键注册为事件。。。我已经尝试添加actionListener,但对语法没有任何了解。任何帮助都将不胜感激 public class Arena extends JFrame { private PaintPanel paintPanel; publi
public class Arena extends JFrame {
private PaintPanel paintPanel;
public Arena() {
setDefaultCloseOperation(EXIT_ON_CLOSE);
setMinimumSize(new Dimension(1000, 720));
paintPanel = new PaintPanel();
getContentPane().add(paintPanel, BorderLayout.CENTER);
paintPanel.setBackground(Color.black);
paintPanel.setFocusable(true);
//paintPanel.addActionListener(this);
pack();
paintPanel.initGame();
}
class PaintPanel extends JPanel implements ActionListener {
private List<Gladiator> gladiators;
private Timer timer;
private Ai AI;
private Load loadObject;
public void initGame() {
timer = new Timer(500, this);
timer.start();
AI = new Ai(gladiators);
loadObject = new Load();
}
@Override
public void actionPerformed(ActionEvent e) {
Object src = e.getSource();
System.out.println("************* "+src);
// if (src == spacebar) {
// } else if (src = timer) {
AI.runAI();
try {
Thread.sleep(100);
System.out.println("sleeping");
} catch (InterruptedException d) {
System.err.println("Caught : InterruptedException" + d.getMessage());
}
repaint();
// }
}
public PaintPanel(){
super();
gladiators = new ArrayList<Gladiator>();
String[][] gladiatorInfo = new String[100][25];
String[] gladiatorRaw = new String[100];
String[][] parsedInfo = new String[250][100];
Gladiator[] gladiator = new Gladiator[20];
int[] matchInfo = new int[3];
int numberofcontestants = 0;
gladiatorRaw = loadObject.getGladiators(gladiatorRaw);
parsedInfo = loadObject.parseStats(gladiatorRaw);
Venue venue = new Venue();
matchInfo = loadObject.getMatchSettings(matchInfo);
venue.populateVenue(matchInfo);
gladiator = createGladiators(venue);
for (int a = 0; a < venue.contestants; a++) {
System.out.println("Populating Gladiator "+a);
gladiator[a].populategladiators(parsedInfo,a);
gladiator[a].getEquipment();
gladiator[a].contestantNumber = a;
gladiators.add(gladiator[a]);
}
}
public Gladiator[] createGladiators(Venue venue) {
int[][] initialPlacement = new int[20][2];
Gladiator[] gladiator = new Gladiator[(venue.contestants)];
initialPlacement = loadObject.loadInitialPlacement(venue.contestants);
for (int a = 0; a < venue.contestants; a++) {
System.out.println("Add gladiator "+a);
gladiator[a] = new Gladiator(initialPlacement[a][0],initialPlacement[a][1]);
System.out.println(initialPlacement[a][0]+","+initialPlacement[a][1]);
}
return gladiator;
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
try {
BufferedImage background = ImageIO.read(new File("background.png"));
g.drawImage(background,0,0,this);
} catch (IOException e) {
System.err.println("Caught IOException: " + e.getMessage());
}
for (Gladiator s : gladiators){
s.draw(g2);
}
}
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
Arena gamePanel = new Arena();
gamePanel.setVisible(true);
}
});
}
}
公共类竞技场扩展JFrame{
私人画板;
公共竞技场(){
setDefaultCloseOperation(关闭时退出);
设置最小尺寸(新尺寸(1000720));
paintPanel=新的paintPanel();
getContentPane().add(paintPanel,BorderLayout.CENTER);
漆面。背景(颜色。黑色);
paintPanel.setFocusable(真);
//paintPanel.addActionListener(此);
包装();
paintPanel.initGame();
}
类PaintPanel扩展JPanel实现ActionListener{
私人名单角斗士;
私人定时器;
私人Ai;
私有加载对象;
公共游戏(){
定时器=新定时器(500,此);
timer.start();
AI=新AI(角斗士);
loadObject=新加载();
}
@凌驾
已执行的公共无效操作(操作事件e){
对象src=e.getSource();
System.out.println(“**************”+src);
//if(src==空格键){
//}else if(src=计时器){
AI.runAI();
试一试{
睡眠(100);
System.out.println(“睡眠”);
}捕获(中断异常d){
System.err.println(“捕获:InterruptedException”+d.getMessage());
}
重新油漆();
// }
}
公共绘画小组(){
超级();
角斗士=新阵列列表();
字符串[][]角斗士信息=新字符串[100][25];
String[]gladiatorRaw=新字符串[100];
字符串[][]parsedInfo=新字符串[250][100];
角斗士[]角斗士=新角斗士[20];
int[]匹配信息=新的int[3];
int numberofcompetities=0;
gladiatorRaw=loadObject.getGladiators(gladiatorRaw);
parsedInfo=loadObject.parseStats(角斗士);
地点=新地点();
matchInfo=loadObject.getMatchSettings(matchInfo);
地点。推广地点(matchInfo);
角斗士=创造角斗士(场地);
对于(int a=0;a
另外,是否有空格键的getEvent()键代码?好像找不到。谢谢您应该使用API
InputMap
/ActionMap
可以应用于从JComponent
扩展的任何组件,但在您的情况下,我建议将其附加到您的PaintPane
您需要通过在某处执行addactionlistener(this)让您的paintpanel监听actionevents。
InputMap im = getInputMap(WHEN_IN_FOCUSED_WINDOW);
ActionMap am = getActionMap();
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0), "space");
am.put("space", new AbstractAction() {
public void actionPerformed(ActionEvent evt) {
if (timer.isRunning()) {
timer.stop();
} else {
timer.start();
}
}
});