Java 键盘不输入任何东西
我一直在尝试并编辑这段代码,但它不起作用。 假设得到一个键盘输入,将其存储在变量“c”中,然后进行比较 按键盘上的键。然后根据按下的键移动一个小正方形。 键盘似乎无法识别。有人能帮我吗? 请注意我已经14岁了,所以请不要说这是多么简单和容易,我还在学习,你能不能用我可能理解的方式来写它。先谢谢你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
'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)
方法对GUI的感知响应性有很大影响,因为它可以控制GUI的绘制和GUI可能包含的任何动画。如果由于任何原因而减慢了速度,您的GUI将看起来很慢paintComponent
- 因此,此方法应用于绘图,仅用于绘图,而不用于绘图。明确地
- 不要从该方法中启动摆动计时器
- 不要从该方法中添加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;
}
}
谢谢。我仍在努力学习,但仍然没有进步。:)@使用