[英]Why wont my Java program acknowledge any key strokes using KeyListener?
我完全不知道為什么我的程序沒有識別鍵盤輸入。 我在整個程序中放置了print語句來確定問題,並且我已經確定keyPressed方法永遠不會激活。 這是我為一個課程項目制作的游戲,是的,我是一個相對初學的程序員。 提前致謝! (以下代碼)
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.ImageIcon;
import javax.swing.JApplet;
public class Dodger extends JApplet implements Runnable, KeyListener {
Thread myThread;
public Image bg;
public Image pic;
public boolean loaded;
public int cx, cy, speed, x, y;
public void init(){
setSize(800,800);
loaded = false;
x = 2;
y = 400;
cx = 0;
cy = 0;
speed = 3;
myThread = new Thread(this);
myThread.start();
addKeyListener(this);
}
public void run(){
loadpic();
repaint();
while (myThread!=null)
{
try{
myThread.sleep(18);
}catch(InterruptedException e){
e.printStackTrace();
}
repaint();
}
}
public void upMotion(){
cy = cy + speed;
}
public void downMotion(){
cy = cy - speed;
}
public void leftMotion(){
cx = cx - speed;
}
public void rightMotion(){
cx = cx + speed;
}
@Override
public void keyPressed(KeyEvent k) {
if (k.getKeyCode() == KeyEvent.VK_LEFT) {
System.out.println("work");
leftMotion();
}
if (k.getKeyCode() == KeyEvent.VK_RIGHT) {
rightMotion();
}
if (k.getKeyCode() == KeyEvent.VK_UP) {
upMotion();
}
if (k.getKeyCode() == KeyEvent.VK_DOWN) {
downMotion();
}
}
@Override
public void keyReleased(KeyEvent e) {
}
@Override
public void keyTyped(KeyEvent e) {
}
public void loadpic(){
bg = new ImageIcon(getClass().getResource("back.png")).getImage();
pic = new ImageIcon(getClass().getResource("smile.png")).getImage();
loaded = true;
repaint();
}
public void paint(Graphics g){
g.drawImage(bg, 0, 0, this);
g.drawImage(pic, cx, cy, this);
}
}
當applet可聚焦並具有焦點時,可以檢測到關鍵事件。 管理焦點一直是applet的問題。 問題主要在於Sun從不打算指定應該理想地應用於可聚焦HTML元素和applet的混合頁面的焦點行為。
根據Tom的建議,添加到init()
的末尾
setFocusable(true);
為了安全起見,還要覆蓋:
public void start() {
this.requestFocusInWindow();
}
順便說一句,通常最好在Swing中使用鍵綁定 。 他們還要求applet具有輸入焦點。
首先,您可能希望將您的類與KeyListener分開,因為它使得它更難以閱讀。
接下來,您想要擺脫裸Thread
並將其包裝在計時器中。
import javax.swing.Timer;
class Dodger extends JApplet {
Timer imageUpdater; //replaces Thread
/*...*/
public void init() {
/*etc*/
loadpic();
int repaintInterval = 100;
imageUpdater = new Timer(repaintInterval,
new ActionListener() {
public void actionPerformed(ActionEvent e) {
repaint();
}
}
);
imageUpdater.start();
addKeyListener(new KeyHandler());
setFocusable(true);
}
/*...*/
private class KeyHandler extends KeyAdapter {
/* Note that with this implementation, you do not have to override
* unnecessary methods, as KeyAdapter is an abstract class that
* implements all of the methods of KeyListener.
*/
@Override
public void keyPressed(KeyEvent e) {
/*...*/
}
}
/*...*/
}
大多數情況只是代碼清理 - 實際問題可能是使用setFocusable(true)
修復的(根據Tom,見注釋setFocusable(true)
。
我不確定它是否適用於Applet,但您的Thread
可能不允許發生事件調度。
嘗試使用SwingWorker運行“工作”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.