4

プログラムがキーボード入力を認識しない理由がまったくわかりません。問題を特定するためにプログラム全体に 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);
}   
}
4

3 に答える 3

5

アプレットがフォーカス可能でフォーカスがある場合、重要なイベントは問題なく検出されます。フォーカスの管理は、常にアプレットの問題でした。問題は主に、フォーカス可能なHTML要素とアプレットの混合ページに理想的に適用されるフォーカス動作をSunがわざわざ指定しなかったことです。

トムのアドバイスに従って、の最後に追加しますinit()

setFocusable(true);

安全のために、以下もオーバーライドします。

public void start() {
    this.requestFocusInWindow();
}

余談ですが、一般的にはSwingでキーバインディングを使用することをお勧めします。また、アプレットに入力フォーカスが必要です。


于 2012-06-12T15:12:39.000 に答える
3

まず、おそらくクラスを 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).

于 2012-06-12T15:07:44.563 に答える
1

アプレットに適用されるかどうかはよくわかりThreadませんが、イベントディスパッチの発生を許可していない可能性があります。

SwingWorkerで「作業」を実行してみてください。

于 2012-06-12T15:07:24.963 に答える