繁体   English   中英

键绑定不运行

[英]Key bindings does not run

我在 netbeans 中工作 java 程序语言。 我想通过使用键绑定来移动一个 jlabel 框。 当我击键时,盒子不能移动。 例如我击键 w,a,s,d 但框不能移动。 当我按下这些键时,它应该是go 上下左右,但程序中没有移动。 盒子留在原处。 应该怎么办?

import java.awt.Color;
import java.awt.event.*;
import javax.swing.*;


public class BoxGame {

JFrame frame;
JLabel label;
Action upAction;
Action downAction;
Action leftAction;
Action rightAction;


BoxGame(){
    
   frame = new JFrame("Keybinding");
   frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   frame.setSize(450,450);
   frame.setLayout(null);
   
   label = new JLabel();
   label.setBackground(Color.red);
   label.setBounds(100,100,100,100);
   label.setOpaque(true);
  
   
   upAction = new UpAction();
   downAction = new DownAction();
   leftAction = new LeftAction();
   rightAction = new RightAction();
   
   label.getInputMap().put(KeyStroke.getKeyStroke("w"), "upAction");
   label.getActionMap().put("upAction",upAction);
   
   label.getInputMap().put(KeyStroke.getKeyStroke("s"), "downAction");
   label.getActionMap().put("downAction", downAction);
   
   label.getInputMap().put(KeyStroke.getKeyStroke("a"), "leftAction");
   label.getActionMap().put("leftAction", leftAction);
   
   label.getInputMap().put(KeyStroke.getKeyStroke("d"), "rightAction");
   label.getActionMap().put("rightAction", rightAction);
   
   frame.add(label);
   frame.setVisible(true);

}

public class UpAction extends AbstractAction{

    @Override
    public void actionPerformed(ActionEvent e) {
        label.setLocation(label.getX(), label.getY()-10);
    }
}

public class DownAction extends  AbstractAction{

    @Override
    public void actionPerformed(ActionEvent e) {
       label.setLocation(label.getX(), label.getY()+10);
    }
}

public class LeftAction extends AbstractAction{

    @Override
    public void actionPerformed(ActionEvent e) {
       label.setLocation(label.getX()-10, label.getY());
    }
}

public class RightAction extends AbstractAction{

    @Override
    public void actionPerformed(ActionEvent e) {
      label.setLocation(label.getX()+10, label.getY());
    }
  }  
}

首先使用更“gloabl”的InputMap ,您正在使用的那个要求组件可聚焦并具有焦点。

避免使用KeyEvent.getKeyStroke(String) ,它会做一些奇怪的事情并且不会帮助你,而是提供实际的KeyEvent ,例如

InputMap inputMap = label.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_W, 0), "upAction");
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_S, 0), "downAction");
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_A, 0), "leftAction");
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_D, 0), "rightAction");

我还建议花时间学习自定义绘画,因为组件往往不能像这样很好地工作。

有关详细信息,请参阅在 AWT 和 Swing 中绘制执行自定义绘制

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM