Java箭头键键侦听器逻辑
因此,我正在尝试为箭头键创建一个键侦听器,它可以响应箭头键,并且可以同时处理多个键。我试图将按下的键放入ArrayList,然后在我的repaint()方法中处理它们。然而,我有一个问题。我不确定在哪里添加密钥,在哪里删除它们。与其说我在寻找代码解决方案,不如说我在寻找它背后的逻辑Java箭头键键侦听器逻辑,java,logic,keylistener,Java,Logic,Keylistener,因此,我正在尝试为箭头键创建一个键侦听器,它可以响应箭头键,并且可以同时处理多个键。我试图将按下的键放入ArrayList,然后在我的repaint()方法中处理它们。然而,我有一个问题。我不确定在哪里添加密钥,在哪里删除它们。与其说我在寻找代码解决方案,不如说我在寻找它背后的逻辑 //graham import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.ev
//graham
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JPanel;
class Arrows extends JPanel implements KeyListener {
private int c = 0;
private int x = 250;
private int y = 250;
private static ArrayList<Integer> keys = new ArrayList<Integer>();
public Arrows() {
this.setPreferredSize(new Dimension(500, 500));
addKeyListener(this);
}
public void addNotify() {
super.addNotify();
requestFocus();
}
public void paintComponent(Graphics g) {
//*********
//need to update to make so can press (and hold) multiple different keys at once
//*********
g.setColor(Color.WHITE);
g.fillRect(x, y , 20, 20);
for(int i = 0; i < keys.size(); i++){ //********> only want to handle one at a time
//handle each key
c = keys.get(i);
switch(c){
case 37:
//left arrow
x -= 10;
keys.remove(i);
break;
case 38:
// up arrow
y -= 10;
keys.remove(i);
break;
case 39:
//right arrow
x += 10;
keys.remove(i);
break;
case 40:
//down arrow
y += 10;
keys.remove(i);
break;
}
}
g.setColor(Color.BLUE);
g.fillRect(x, y, 20, 20);
}
public void keyPressed(KeyEvent e) {
//******
//need to create a list of keys pressed, then process them in the repaint. Later delete them after pressed
//******
keys.add(e.getKeyCode());
//repaint();
}
public void keyReleased(KeyEvent e) {
//****
//here need to repaint --- need to correct to do something proper later --- due to holding down a key teleports..
//****
repaint();
}
public void keyTyped(KeyEvent e) {
}
public static void main(String[] s) {
JFrame f = new JFrame();
f.getContentPane().add(new Arrows());
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.pack();
f.setVisible(true);
//need to null out keys
keys.add(65);
}
}
//格雷厄姆
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.Graphics;
导入java.awt.event.KeyEvent;
导入java.awt.event.KeyListener;
导入java.util.ArrayList;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
类箭头扩展了JPanel实现了KeyListener{
私有int c=0;
私有整数x=250;
私人整数y=250;
私有静态ArrayList键=新ArrayList();
公共箭头(){
此.setPreferredSize(新尺寸(500500));
addKeyListener(此);
}
public void addNotify(){
super.addNotify();
requestFocus();
}
公共组件(图形g){
//*********
//需要更新以使您可以同时按下(并按住)多个不同的键
//*********
g、 setColor(Color.WHITE);
g、 fillRect(x,y,20,20);
对于(int i=0;i一次只处理一个
//处理每把钥匙
c=键。获取(i);
开关(c){
案例37:
//左箭头
x-=10;
钥匙。移除(i);
打破
案例38:
//向上箭头
y-=10;
钥匙。移除(i);
打破
案例39:
//右箭头
x+=10;
钥匙。移除(i);
打破
案例40:
//向下箭头
y+=10;
钥匙。移除(i);
打破
}
}
g、 setColor(Color.BLUE);
g、 fillRect(x,y,20,20);
}
按下公共无效键(键事件e){
//******
//需要创建一个按键列表,然后在重绘中处理它们。稍后在按下后删除它们
//******
添加(例如getKeyCode());
//重新油漆();
}
公开无效密钥已释放(密钥事件e){
//****
//这里需要重新绘制---需要更正以便以后做正确的事情---因为按住了一个键。。
//****
重新油漆();
}
public void keyTyped(KeyEvent e){
}
公共静态void main(字符串[]s){
JFrame f=新的JFrame();
f、 getContentPane().add(新箭头());
f、 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f、 包装();
f、 setVisible(真);
//需要清空密钥
增加(65);
}
}
看看你是否可以用我的代码作为例子。他们非常相似
import java.awt.BorderLayout;
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.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
public class MyGame extends JPanel implements ActionListener, KeyListener {
Timer t = new Timer(5, this);
int x = 0, y = 0, velx =0, vely =0, g = 0;
private Color color;
public MyGame() {
t.start();
addKeyListener(this);
setFocusable(true);
setFocusTraversalKeysEnabled(false);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(800, 1000);
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(color);
g.fillRect(x, y, 50, 30);
@Override
public void keyPressed(KeyEvent e) {
int code = e.getKeyCode();
{
if (code == KeyEvent.VK_DOWN) {
vely = 1; // removing velx = 0 allows us to go vertically and horizontlly at the same time
}
if (code == KeyEvent.VK_UP) {
vely = -1; // same goes for here
}
if (code == KeyEvent.VK_LEFT) {
velx = -1;
}
{
if (code == KeyEvent.VK_RIGHT) {
velx = 1;
}
}
}
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyReleased(KeyEvent e) {
velx = 0;
vely = 0;
}
public static void main (String arge[]){
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new Incoming());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
你试过了吗?我不确定如何使用密钥绑定。你能提供一个链接吗?那是评论中的一个链接。谢谢,我会查出来的谢谢你的回复,但是什么是传入(),它在第111行,给了我一个错误?没有它,这个程序似乎无法运行。看起来是这样的:frame.add(newincoming());这是一个示例,我不希望您复制并粘贴代码。这是我的第二节课。据我所知,您在使用关键侦听器方面遇到了问题。这将向您展示如何添加键。如果你仍然不知道如何更详细地解释你的问题,那么我可以更好地帮助你。