Java 键盘不输入任何东西

Java 键盘不输入任何东西,java,swing,focus,jpanel,keylistener,Java,Swing,Focus,Jpanel,Keylistener,我一直在尝试并编辑这段代码,但它不起作用。 假设得到一个键盘输入,将其存储在变量“c”中,然后进行比较 按键盘上的键。然后根据按下的键移动一个小正方形。 键盘似乎无法识别。有人能帮我吗? 请注意我已经14岁了,所以请不要说这是多么简单和容易,我还在学习,你能不能用我可能理解的方式来写它。先谢谢你 'package package1; import java.awt.Color; import java.awt.Graphics; import java.awt.event.ActionEven

我一直在尝试并编辑这段代码,但它不起作用。 假设得到一个键盘输入,将其存储在变量“c”中,然后进行比较 按键盘上的键。然后根据按下的键移动一个小正方形。 键盘似乎无法识别。有人能帮我吗? 请注意我已经14岁了,所以请不要说这是多么简单和容易,我还在学习,你能不能用我可能理解的方式来写它。先谢谢你

'package package1;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;

public class Class1 extends JPanel implements KeyListener, ActionListener{

Timer timer = new Timer(5, this);

//variables    
int cox = 0;
int spx = 0;  //cox = coordinates x, spx = speedx
int coy = 0;
int spy = 0;  //coy = coordinates y, spy = speedy

public void paintComponent(Graphics g)
{
    timer.start();

    super.paintComponent(g);
    g.setColor(Color.BLUE);     
    g.fillRect(cox, coy, 50, 50);

    addKeyListener(this);
    setFocusable(true);
    setFocusTraversalKeysEnabled(false);
}

public void actionPerformed(ActionEvent e)
{
    cox = cox + spx;
    coy = coy + spy;
    repaint();
}

public void keyPressed(KeyEvent e)
{
    int c = e.getKeyCode();

    if(c == KeyEvent.VK_LEFT)
    {
        spx = -1;
        spy = 0;
    }
    if(c == KeyEvent.VK_UP)
    {
        spx = 0;
        spy = -1;
    }
    if(c == KeyEvent.VK_RIGHT)
    {
        spx = 1;
        spy = 0;
    }
    if(c == KeyEvent.VK_DOWN)
    {
        spx = 0;
        spy = 1;
    }

}

public void keyTyped(KeyEvent e)
{
}
public void keyReleased(KeyEvent e)
{
    spx = 0;
    spy = 0;
}

public static void main(String args[])
{
    Class1 t = new Class1();
    JFrame frame = new JFrame("window");
    frame.setSize(500,500);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.add(t);
}
}

代码的问题:

  • KeyListener是非常低级的构造,在大多数Swing应用程序中,通常应该避免使用键绑定。这样做还可以更容易地解决困扰KeyListener的焦点问题,这会导致您当前的KeyListener什么都不做。如果你在这个网站上阅读了大多数带有Swing和KeyListeners标签的问题,你会一次又一次地看到这个建议——因为这是真的,而且有效
  • 请理解
    paintComponent(Graphics g)
    方法仅用于绘制。它经常被调用,常常是在你无法控制的情况下,因为操作系统可以诱导它被调用
  • paintComponent
    方法对GUI的感知响应性有很大影响,因为它可以控制GUI的绘制和GUI可能包含的任何动画。如果由于任何原因而减慢了速度,您的GUI将看起来很慢
  • 因此,此方法应用于绘图,仅用于绘图,而不用于绘图。明确地
    • 不要从该方法中启动摆动计时器
    • 不要从该方法中添加KeyListener(除非您希望将KeyListener添加到GUI 20次,这将导致无法预测的行为)
    • 不要在此方法中更改任何对象的状态

例如:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.util.EnumMap;
import java.util.HashMap;
import java.util.Map;

import javax.swing.*;

@SuppressWarnings("serial")
public class Class1B extends JPanel {   
   private static final int PREF_W = 500;
   private static final int PREF_H = PREF_W;
   private static final int ANIMATION_DELAY = 15;
   private static final int RECT_WIDTH = 15;
   private static final Color RECT_COLOR = Color.red;
   private EnumMap<Direction, Boolean> dirMap = new EnumMap<>(Direction.class);
   private Map<Integer, Direction> keyToDir = new HashMap<>();
   private Timer animationTimer;
   public int rectX;
   public int rectY;


   public Class1B() {
      for (Direction dir : Direction.values()) {
         dirMap.put(dir, Boolean.FALSE);
      }
      keyToDir.put(KeyEvent.VK_UP, Direction.UP);
      keyToDir.put(KeyEvent.VK_DOWN, Direction.DOWN);
      keyToDir.put(KeyEvent.VK_LEFT, Direction.LEFT);
      keyToDir.put(KeyEvent.VK_RIGHT, Direction.RIGHT);
      setKeyBindings();

      animationTimer = new Timer(ANIMATION_DELAY, new AnimationListener());
      animationTimer.start();
   }

   @Override
   public Dimension getPreferredSize() {
      return new Dimension(PREF_W, PREF_H);
   }

   @Override
   protected void paintComponent(Graphics g) {
      super.paintComponent(g);
      g.setColor(RECT_COLOR);
      g.fillRect(rectX, rectY, RECT_WIDTH, RECT_WIDTH);
   }

   private void setKeyBindings() {
      int condition = WHEN_IN_FOCUSED_WINDOW;
      final InputMap inputMap = getInputMap(condition);
      final ActionMap actionMap = getActionMap();
      boolean[] keyPressed = { true, false };
      for (Integer keyCode : keyToDir.keySet()) {
         Direction dir = keyToDir.get(keyCode);
         for (boolean onKeyPress : keyPressed) {
            boolean onKeyRelease = !onKeyPress;
            KeyStroke keyStroke = KeyStroke.getKeyStroke(keyCode, 0,
                  onKeyRelease);
            Object key = keyStroke.toString();
            inputMap.put(keyStroke, key);
            actionMap.put(key, new KeyBindingsAction(dir, onKeyPress));
         }
      }
   }

   private class KeyBindingsAction extends AbstractAction {
      private Direction dir;
      boolean pressed;

      public KeyBindingsAction(Direction dir, boolean pressed) {
         this.dir = dir;
         this.pressed = pressed;
      }

      @Override
      public void actionPerformed(ActionEvent evt) {
         dirMap.put(dir, pressed);
      }
   }

   private class AnimationListener implements ActionListener {
      @Override
      public void actionPerformed(ActionEvent evt) {
         boolean repaint = false;
         for (Direction dir : Direction.values()) {
            if (dirMap.get(dir)) {
               rectX += dir.getIncrX();
               rectY += dir.getIncrY();
               repaint = true;
            }
         }
         if (repaint) {
            repaint();
         }
      }
   }

   private static void createAndShowGui() {
      Class1B mainPanel = new Class1B();

      JFrame frame = new JFrame("Class1B");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

enum Direction {
   UP(0, -1), DOWN(0, 1), LEFT(-1, 0), RIGHT(1, 0);
   private int incrX;
   private int incrY;

   private Direction(int incrX, int incrY) {
      this.incrX = incrX;
      this.incrY = incrY;
   }

   public int getIncrX() {
      return incrX;
   }

   public int getIncrY() {
      return incrY;
   }
}
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.Graphics;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.awt.event.KeyEvent;
导入java.util.EnumMap;
导入java.util.HashMap;
导入java.util.Map;
导入javax.swing.*;
@抑制警告(“串行”)
公共类Class1B扩展了JPanel{
专用静态最终整数预值W=500;
私有静态final int PREF_H=PREF_W;
专用静态最终int动画_延迟=15;
私有静态最终整数矩形宽度=15;
私有静态最终颜色RECT_Color=Color.red;
私有EnumMap dirMap=新EnumMap(Direction.class);
私有映射keyToDir=newhashmap();
私人定时器动画定时器;
公共int rectX;
公共关系;
公共服务类别乙({
for(Direction dir:Direction.values()){
dirMap.put(dir,Boolean.FALSE);
}
keyToDir.put(KeyEvent.VK_UP,Direction.UP);
keyToDir.put(KeyEvent.VK_DOWN,Direction.DOWN);
keyToDir.put(KeyEvent.VK_左,Direction.LEFT);
keyToDir.put(KeyEvent.VK_RIGHT,Direction.RIGHT);
setKeyBindings();
animationTimer=新计时器(ANIMATION_DELAY,new AnimationListener());
animationTimer.start();
}
@凌驾
公共维度getPreferredSize(){
返回新维度(PREF_W,PREF_H);
}
@凌驾
受保护组件(图形g){
超级组件(g);
g、 setColor(RECT_COLOR);
g、 fillRect(矩形、矩形、矩形宽度、矩形宽度);
}
私有void setKeyBindings(){
int condition=当在聚焦窗口中时;
最终InputMap InputMap=getInputMap(条件);
final ActionMap ActionMap=getActionMap();
布尔[]键按下={true,false};
for(整数键代码:keyToDir.keySet()){
Direction dir=keyToDir.get(keyCode);
用于(布尔onKeyPress:keyPressed){
布尔值onKeyRelease=!onKeyPress;
击键击键=击键。getKeyStroke(键代码,0,
onKeyRelease);
Object key=keyStroke.toString();
inputMap.put(击键,键);
put(key,newkeybindingsaction(dir,onKeyPress));
}
}
}
私有类KeyBindingsAction扩展了AbstractAction{
私人指导主任;
布尔按下;
公钥绑定操作(方向方向,按布尔值){
this.dir=dir;
this.pressed=pressed;
}
@凌驾
已执行的公共无效操作(操作事件evt){
dirMap.put(dir,按下);
}
}
私有类AnimationListener实现ActionListener{
@凌驾
已执行的公共无效操作(操作事件evt){
布尔重绘=假;
for(Direction dir:Direction.values()){
if(dirMap.get(dir)){
rectX+=dir.getIncrX();
rectY+=dir.getIncrY();
重新绘制=真;
}
}
如果(重新喷漆){
重新油漆();
}
}
}
私有静态void createAndShowGui(){
Class1B主面板=新Class1B();
JFrame=新JFrame(“Class1B”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(主面板);
frame.pack();
frame.setLocationByPlatform(真);
frame.setVisible(true);
}
公共静态void main(字符串[]args){
SwingUtilities.invokeLater(新的Runnable(){
公开募捐{
createAndShowGui();
}
});
}
}
枚举方向{
向上(0,-1),向下(0,1),左(-1,0),右(1,0);
私人int incrX;
私营企业;
私人方向(内部控制,内部控制){
this.incrX=incrX;
this.incrY=incrY;
}
public int getIncrX(){
返回incrX;
}
public int getIncrY(){
返回incrY;
}
}

谢谢。我仍在努力学习,但仍然没有进步。:)@使用