【急】关于键盘事件的问题

catici 2009-06-20 09:50:54
这是我做的关于键盘事件的一个简单的java程序,就是由两个小方块,按上下左右键第一个小方块可以移动,按WSAD四个键让第二个小方块上下左右的移动。可是运行的时候只是两个静止的小正方形,按键盘没有任何反应,希望大家能给点意见……
谢谢了……


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

public class KeyEventDemo extends JApplet implements KeyListener{
final int size = 20;
int x1,x2,y1,y2;
int x11,y11,x22,y22;
Color fillColor=Color.red;

public void init(){
setBackground(Color.yellow);
Dimension d =this.getSize();
x1=0;y1=d.height/2-size/2;
x11=x1;y11=y1;
x2=d.width/2-size/2;y2=0;
x22=x2;y22=y2;
this.setFocusable(true);
this.setFocusable(false);


}

public void paint(Graphics g)
{
g.setColor(Color.cyan);
g.fillRect(x11,y11,size,size);
g.fillRect(x22,y22,size,size);
g.setColor(fillColor);
g.fillRect(x1,y1,size,size);
g.fillRect(x2,y2,size,size);

}

/*------------第一个小正方形的移动----------------*/
public void keyPressed(KeyEvent e)
{

if(e.getKeyCode()==KeyEvent.VK_UP)
{
y11=y1;x11=x1;
y1=y1-8;
if(y1<=3)y1=3;
repaint();

}

else if(e.getKeyCode()==KeyEvent.VK_DOWN)
{
y11=y1;x11=x1;
y1=y1+8;
if(y1>=getSize().height-3-size)y1=getSize().height-3-size;
repaint();
}

else if(e.getKeyCode()==KeyEvent.VK_LEFT)
{
x11=x1;y11=y1;
x1=x1-8;
if(x1<=3) x1=3;
repaint();

}

else if(e.getKeyCode()==KeyEvent.VK_RIGHT)
{
x11=x1;y11=y1;
x1=x1+8;
if(x1>=getSize().height-3-size)x1=getSize().height-3-size;
repaint();
}



}
/*------------第二个小正方形的移动----------------*/
public void keyTyped(KeyEvent e)
{
char ch=e.getKeyChar();
if(ch=='W'||ch=='w')
{
y22=y2;x22=x2;
y2=y2-8;
if(y2<=3)y2=3;
repaint();

}

else if(ch=='S'||ch=='s')
{
y22=y2;x22=x2;
y2=y2+8;
if(y2>=getSize().height-3-size)y2=getSize().height-3-size;
repaint();
}

else if(ch=='A'||ch=='a')
{
x22=x2;y22=y2;
x2=x2-8;
if(x2<=3) x2=3;
repaint();

}

else if(ch=='D'||ch=='d')
{
x22=x2;y22=y2;
x2=x2+8;
if(x2>=getSize().height-3-size)x2=getSize().height-3-size;
repaint();

}


}

public void keyReleased(KeyEvent e){}

}




...全文
69 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
catici 2009-06-27
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 zuijiejina 的回复:]
楼主帮你改好咯,关键是你没有对japplet进行监听
[/Quote]

谢谢你哦……
O(∩_∩)O~
catici 2009-06-26
  • 打赏
  • 举报
回复
麻烦知道的人能不能帮忙一下啊?
zuijiejina 2009-06-26
  • 打赏
  • 举报
回复
楼主帮你改好咯,关键是你没有对japplet进行监听
zuijiejina 2009-06-26
  • 打赏
  • 举报
回复
[code=java]
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class KeyEventDemo extends JApplet implements KeyListener{



final int size = 20;
int x1,x2,y1,y2;
int x11,y11,x22,y22;
Color fillColor=Color.red;


public void init(){
this.addKeyListener(this);
setBackground(Color.yellow);
Dimension d =this.getSize();
x1=0;y1=d.height/2-size/2;
x11=x1;y11=y1;
x2=d.width/2-size/2;y2=0;
x22=x2;y22=y2;
this.setFocusable(true);
// this.setFocusable(false);


}

public void paint(Graphics g)
{
g.setColor(Color.cyan);
g.fillRect(x11,y11,size,size);
g.fillRect(x22,y22,size,size);
g.setColor(fillColor);
g.fillRect(x1,y1,size,size);
g.fillRect(x2,y2,size,size);


}


/*------------第一个小正方形的移动----------------*/
public void keyPressed(KeyEvent e)
{

if(e.getKeyCode()==KeyEvent.VK_UP)
{

y11=y1;x11=x1;
y1=y1-8;
if(y1 <=3)y1=3;
repaint();

}

else if(e.getKeyCode()==KeyEvent.VK_DOWN)
{
y11=y1;x11=x1;
y1=y1+8;
if(y1>=getSize().height-3-size)y1=getSize().height-3-size;
repaint();
}

else if(e.getKeyCode()==KeyEvent.VK_LEFT)
{
x11=x1;y11=y1;
x1=x1-8;
if(x1 <=3) x1=3;
repaint();

}

else if(e.getKeyCode()==KeyEvent.VK_RIGHT)
{
x11=x1;y11=y1;
x1=x1+8;
if(x1>=getSize().height-3-size)x1=getSize().height-3-size;
repaint();
}


}
/*------------第二个小正方形的移动----------------*/
public void keyTyped(KeyEvent e)
{
char ch=e.getKeyChar();
if(ch=='W'||ch=='w')
{
y22=y2;x22=x2;
y2=y2-8;
if(y2 <=3)y2=3;
repaint();

}

else if(ch=='S'||ch=='s')
{
y22=y2;x22=x2;
y2=y2+8;
if(y2>=getSize().height-3-size)y2=getSize().height-3-size;
repaint();
}

else if(ch=='A'||ch=='a')
{
x22=x2;y22=y2;
x2=x2-8;
if(x2 <=3) x2=3;
repaint();

}

else if(ch=='D'||ch=='d')
{
x22=x2;y22=y2;
x2=x2+8;
if(x2>=getSize().height-3-size)x2=getSize().height-3-size;
repaint();

}


}

public void keyReleased(KeyEvent e){}

}
[code]
zuijiejina 2009-06-26
  • 打赏
  • 举报
回复
是没有重画吗?楼主你测试下,repaint语句执行了吗?或者是事实上重画了,但是japplet没有显示?
阳二快跑 2009-06-22
  • 打赏
  • 举报
回复
public void init(){
setBackground(Color.yellow);
Dimension d =this.getSize();
x1=0;y1=d.height/2-size/2;
x11=x1;y11=y1;
x2=d.width/2-size/2;y2=0;
x22=x2;y22=y2;
this.setFocusable(true);
this.setFocusable(false);
this.addKeyListener(this); //Add
this.setFocusable(true); //Add
this.requestFocus(); //Add
}
catici 2009-06-21
  • 打赏
  • 举报
回复
不好意思,楼上的两位,我按照你们说的去改了,怎么不行呢?
swandragon 2009-06-20
  • 打赏
  • 举报
回复
注释掉this.setFocusable(false);
加上监听

public void init(){
setBackground(Color.yellow);
Dimension d =this.getSize();
x1=0;y1=d.height/2-size/2;
x11=x1;y11=y1;
x2=d.width/2-size/2;y2=0;
x22=x2;y22=y2;
this.setFocusable(true);
//this.setFocusable(false);
addKeyListener(this);
}
lucky_9_9 2009-06-20
  • 打赏
  • 举报
回复

public void keyPressed(KeyEvent e) {
int mes=e.getKeyCode();//接收按键值
if(KeyEvent.VK_DOWN==mes){
//按向下键要做的事
}
if(KeyEvent.VK_UP==mes){
//按向上键要做的事
}
if(KeyEvent.VK_LEFT==mes){
//按向左要做的事
}
if(KeyEvent.VK_RIGHT==mes){
//按向右键要做的事
}

}


恩,的确,这个Keyclone的功能是比AutoHotKey要来的强,而且更简单。所以我还是要向大家推荐,并且给大家一些简单的教程,好让大家快速上手。 首先下载破解版本,免安装的,双击Keyclone.exe,进入主界面,如下: 恩,这个是我现在的配置,你第一次打开时没有192.168.1.103:1442.....这一行的,别,咱们进入setup配置下,点setup,进入下图: 进入general这一项,先在keyclone name取个标识你的keyclone的名字,我随便取了个sony. local port是在两台电脑上联机使用keyclone的端口,只要你的端口没被占用,可以随便取,建议默认的就好。 send only 我一般是不勾的,因为这个项目是在另外一台电脑和你联机时,他通过keyclone发送的按键,这里也可以收到,如果勾了的话,就不能接收别机的键盘信号了。 auto-add windows titled,这个勾了的话,就可以自动识别你的windows窗口名,并自动加入到keyclone控制栏里了,exact name match,勾上就是精确识别下面设置的名称,建议勾上。最后在下面的文本框输入你要控制的各种窗口名字,恩,相信大家都是用来多开魔兽的,所以请写上"魔兽世界",台湾的写繁体版本的魔兽世界,欧美的写world of warcraft即可。 下面的几个pass mouse clicks,镜像鼠标点击(应该是只相应鼠标点击事件) distinguish left/right(区分鼠标左键和右键,对应pass mouse clicks) focus follows mouse,不知道到底有何作用,焦点跟随鼠标?我个人没有使用这个功能 always-on-top,使keyclone软件界面总在前面,基本不用 我都没勾,因为我个人觉得暂时用不到。 startup command我没使用 auto-connect,这个要好好设置下,主要是那些像我10开或15开的疯子,在2台电脑上利用keyclone联机使用多开的时候,利用这个,可以自动的连接2台电脑。如你所见,我在里面填的是192.168.1.103:1442 192.168.1.103是我的另外一台需要连接的电脑的内网IP地址,1442是上面填写的端口号。填写好后,每次打开keyclone软件,就自动添加了这个IP,并不停监听端口,你这个时候再打开另外一台电脑的keyclone,就会自动识别在这个主keyclone了。其实keyclone没有所谓主和副而言,在不同电脑的keyclone都是并列的。 OK,点apply, 再点OK,这样,就基本配置好了。 你这个时候,只要打开多个魔兽世界游戏,即可,keyclone会自动识别。如下图: 然后最小化keyclone,就会自动缩小在右下角了,进入游戏吧。我保证你会有时间需要使keyclone暂停的,这时你只要把鼠标右键点击keyclone的小图*出现小窗口,点override即可,再点一次就是恢复正常。 keyclone默认的是把所有键盘都镜像了,所以,你应该会要让某几个键位不镜像,譬如wasd,这个如果镜像了,再游戏里,会很乱,无法跟随。于是,你要进入setup,点do-not-pass,如下图: 在那里,先点击这行字,再按你要屏蔽的键盘,这样你屏蔽的键盘都会列表在上面的表里,你可以随时增加,取消。点apply和OK,就设置好了。 最后,在双机多开的操作中,另外一台电脑上的keyclone设置和以上的一样,只要把auto-connect的IP地址改成“你的IP地址:你设置的keyclone端口”即可,就能自动识别局域网里keyclone了。 ROUND-ROBIN 這個是設置某個鍵位輪流依次在各個遊戲窗口裏輸出。譬如聖騎士的神聖之錘,你可以輪流按神聖之錘所在的鍵位,第一次按是施放第一個窗口,第二次按是施放第二個窗口的。。。 接下来是宏的部分 当我在主窗口按了1后,其他的几个副窗口,都会得到1个“1”的数字输入,也就是可以实现后台操作。当然,这个时候只要在副窗口的号里设置了1个宏,并把这个宏放到按键1的位置,那么就成功啦。以下是宏的设置 ----------------------------------

62,629

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧