1

KeyListenersが私の最大の障害であることが判明した最近まで、KeyListenersを大多数に使用していたため、Key Bindingsには少し慣れていません。KeyBindings を使用して keyReleased のようなイベントをどのようにプログラムするのか疑問に思っています。KeyListeners は、keyPressed、keyTyped、keyReleased の 3 つの簡単なメソッドを提供しましたが、キー バインディングでこれを実現する方法については少し混乱しています。

基本的に、ユーザーが UP を押すと、オブジェクトが上に移動するようにします。ただし、ユーザーが UP を放すと、オブジェクトは自動的に下に移動して、基本的な重力をシミュレートする必要があります。UpAction クラスを示す私のコードの一部を次に示します。

class UpAction extends AbstractAction
{
    public void actionPerformed(ActionEvent tf)
    {
        north = true;
        helitimer.start();
        helitimer.start();
        helitimer2.start();
        repaint();
    }
}

3 つのヘリタイマーは、オブジェクトの y 位置を継続的かつスムーズにインクリメントする一連のタイマーを開始するタイマー オブジェクトです。アクション upAction が呼び出されると、クラス UpAction が呼び出され、オブジェクトを移動するために 3 つのタイマーが開始されます。

とにかく、ユーザーが UP をリリースすると、アクションが呼び出されなくなり、タイマーが停止するようにすることはできますか?

どうもありがとう!

4

1 に答える 1

3

KeyBindings を使用して keyReleased のようなイベントをどのようにプログラムするのか疑問に思っています

keyPressed イベントの場合とまったく同じ方法です。違いは KeyStroke にあります。KeyStroke API を読むと、keyReleased イベントの KeyStroke を作成する方法が示されます。KeyStroke の作成方法に応じて、いくつかの方法があります。

KeyStroke メソッドは keyPressed を想定しているため、keyReleased イベントに追加のパラメーターまたは追加のキーワードを追加する必要があります。KeyStroke の作成に使用している方法がわからないため、正確な変更を伝えることはできません。詳細については、API を確認してください。

3 つのヘリタイマーは、オブジェクトの y 位置を継続的かつスムーズにインクリメントする一連のタイマーを開始するタイマー オブジェクトです。

これには3タイマーは必要ありません。1 つのタイマーで問題なく動作するはずです。

とにかく、ユーザーが UP をリリースすると、アクションが呼び出されなくなり、タイマーが停止するようにすることはできますか?

keyPress アクションでタイマーを「開始」できる場合は、keyReleasedAction でタイマーを「停止」できます。必要なのはタイマーへの参照だけです。投稿したコードに基づいて、Timer をクラス変数として既に定義しているため、これは問題になりません。

ただし、ユーザーが上を離すと、オブジェクトは自動的に下に移動して、基本的な重力をシミュレートする必要があります

これを行うには、別のタイマーが必要になるように思えます。

別のオプションは、タイマーを常に実行することです。次に、UP キーを押すと、Y が負の値に増分されます。UP キーを放すと、Y が正の値に増加します。

于 2013-05-19T04:10:02.343 に答える