1

このコードは正しくビルドされ、すべてが機能しているように見えますが、キーは何もしません。アクションリスナーか楕円形が更新されていないかのどちらかだと思います。私は初心者のJavaゲームプログラミングを試しています。簡単なことだと思いますが、うまくいきません。それが違いを生むなら、私は崇高なテキスト2のマックにいます。

package javagame;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class JavaGame extends JFrame {

int x, y;

public class AL extends KeyAdapter {

    public void keyPressed(KeyEvent e) {
        int keycode = e.getKeyCode();
        if(keycode == e.VK_LEFT); {
            x-= 3;
        }
        if(keycode == e.VK_RIGHT); {
            x+= 3;
        }
        if(keycode == e.VK_UP); {
            y-= 3;
        }
        if(keycode == e.VK_DOWN); {
            y+= 3;
        }
    }


    public void keyReleased(KeyEvent e) {

    }
}

public JavaGame() {
    addKeyListener(new AL());
    setTitle("Jave Game");
    setSize(700, 700);
    setResizable(false);
    setVisible(true);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    x = 350;
    y = 350;
}

public void paint(Graphics g) {
    g.fillOval(x, y, 15, 15);

    repaint();
}

public static void main(String[] args) {
    new JavaGame();
}

}
4

2 に答える 2

6

ifステートメントからセミコロンを削除する必要があります。

if (keycode == e.VK_LEFT)
{
   x-= 3;
}

現在、ステートメントに続くコードブロックはif、セミコロンがそれらのステートメントを終了するときに自立します。


いくつかの特定のSwingメモ:

  • ペイントパフォーマンスを向上させるにpaintComponentは、サブクラスから使用することをお勧めします。JComponent
  • キーイベント管理を改善するには、キーバインディングを使用します。KeyListenerこれがです。
于 2012-12-08T21:52:44.733 に答える
2

提案された修正を行っても、問題が発生する可能性があります。

まず、JFrame実際にはその上にいくつかのコンポーネントが含まれています。ルートペインにはコンテンツとレイヤードペインが含まれ、ガラスペイン(通常は非表示)が含まれます。これらのコンポーネントのいずれかが何らかの理由でキーボードフォーカスを取得した場合、キーリスナーは無視される可能性があります。

より良い解決策は、フォーカスの問題をより細かく制御できるキーバインディングAPIを使用することです。

塗装契約にも違反しました。ほとんどの場合、呼び出す必要がありsuper.paintます。実際、トップレベルのコンテナのpaintメソッドをオーバーライドすることはお勧めしません。代わりに、のようなものから拡張して、代わりにそのメソッドJPanelをオーバーライドします。paintComponent

これらのペイント方法は非常に重要な作業を実行するため、無視したり、軽くスキップしたりしないでください。詳細については、AWTおよびSwingのPaintingとSwingのCustomPaintingを参照してください。

于 2012-12-08T22:11:12.913 に答える