簡體   English   中英

為什么我的Java程序不會使用KeyListener確認任何擊鍵?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM