0

以下は、私のアプレット ゲームの要約コードです。

import java.applet.Applet;
import java.awt.event.*;
import java.awt.*;

public class Game extends Applet implements KeyListener, Runnable {
    Button options = new Button("Options");
    Thread thread = new Thread(this);

    public void init() {
        addKeyListener(this);
        thread.start();
    }

    public void paint(Graphics graphics) {
        // draw stuff
    }

    public void run() {
        try {
            while (true) {
                thread.sleep(40);
                repaint();
            }
        } catch (InterruptedException exception) {}
    }

    public void keyPressed(KeyEvent keyEvent) {
        switch (keyEvent.getKeyCode()) {
        case KeyEvent.VK_ESCAPE:
            // pause game
            add(options);
        }
    }

    public void keyReleased(KeyEvent keyEvent) {}
    public void keyTyped(KeyEvent keyEvent) {}
}

私のゲームは期待どおりに動作します。ただし、ユーザーが押すEscと、ゲームを一時停止してオプション ボタンを表示したいと考えています。

問題は、それを押すEscと、期待どおりにゲームが一時停止することです。ただし、画面にボタンは表示されません。私は役に立たない解決策を探してみました。正確には何が起こっているのですか?

4

1 に答える 1

1

私にとっては完璧に機能します...

public class TestApplet02 extends Applet implements KeyListener, Runnable {

    Button options = new Button("Options");
    Thread thread = new Thread(this);
    int y = 0;

    public void init() {
        thread.start();
    }

    @Override
    public void start() {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                setLayout(new BorderLayout());
                addKeyListener(TestApplet02.this);
            }
        });
    }

    public void paint(Graphics graphics) {
        super.paint(graphics);
        Graphics2D g2d = (Graphics2D) graphics;
        y++;
        if (y > getHeight()) {
            y = 0;
        }
        g2d.drawLine(0, y, getWidth(), y);
    }

    public void run() {
        try {
            while (true) {
                thread.sleep(40);
                SwingUtilities.invokeLater(new Runnable() {
                    @Override
                    public void run() {
                        repaint();
                    }
                });
            }
        } catch (InterruptedException exception) {
        }
    }

    public void keyPressed(KeyEvent keyEvent) {
        switch (keyEvent.getKeyCode()) {
            case KeyEvent.VK_ESCAPE:
                // pause game
                add(options);
                invalidate();
                revalidate();
        }
    }

    public void keyReleased(KeyEvent keyEvent) {
    }

    public void keyTyped(KeyEvent keyEvent) {
    }
}

TrashGod が提供するリンクから...

アプレットでは、invokeAndWait を使用して init メソッドから GUI 作成タスクを起動する必要があります。そうしないと、GUI が作成される前に init が返され、Web ブラウザがアプレットを起動する際に問題が発生する可能性があります。他の種類のプログラムでは、GUI 作成タスクのスケジューリングは、通常、最初のスレッドが最後に行うことなので、invokeLater を使用するか、invokeAndWait を使用するかは問題ではありません。

更新しました

私が抱えていた主な問題は次のとおりです。

エスケープ キー ハンドラーでは、方向が 0 の場合、一時停止オプションはアクティブになりません...

case KeyEvent.VK_ESCAPE:
    direction = -direction;

    if (direction < 0) {
        add(options);
    } else {
        remove(options);
    }

私がしなければならなかった他のことは電話でしたrevalidate...

invalidate();
revalidate();
repaint();
于 2012-10-11T02:02:10.517 に答える