Java GUI:WASDキーを使用してボールを移動する方法は?

Titus Ng

ユーザーがWASDキーを押してウィンドウ上でボールを動かすことができるプログラムを書きたいと思います。ただし、ユーザーがキーを押しても何も起こりません。以下は私のプログラムのコードです、誰かが私に何が悪いのか教えてもらえますか、またはどうすれば私のプログラムを改善できますか?(KeyListenerを削除してsuper.x ++;をball.move()に入れると、ボールが移動する可能性があります)

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import javax.swing.JApplet;
import javax.swing.JComponent;
import java.awt.geom.*;
public class MoveBall extends JApplet
{
    public final int Width =  567;
    public final int Height = 567;
    public static PaintSurface canvas;
    public void init()
    {
        canvas = new PaintSurface();
        this.setSize(Width, Height);
        this.add(canvas, BorderLayout.CENTER);
        ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(3);
        executor.scheduleAtFixedRate(new Action(), 0L, 10L, TimeUnit.MILLISECONDS);
    }
}
class Action implements Runnable
{
    public void run() 
    {
        MoveBall.canvas.repaint();  
    }   
}
class PaintSurface extends JComponent
{   
    Ball ball = new Ball(20);
    public PaintSurface()
    {
        addKeyListener(new Listener());
    }
    public void paint(Graphics g)
    {
        Graphics2D g2 = (Graphics2D)g;
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        ball.move();
        g2.setColor(Color.GREEN);
        g2.fill(ball);
        g2.setColor(Color.BLACK);
        g2.drawString("W,A,S,D or arrow keys to move", 7, 17);
    }
}
class Ball extends Ellipse2D.Float
{
    public int xspeed, yspeed;
    public Ball(int d)
    {
        super(370,370, d,d);
    }
    public void move()
    {
        if(super.x >567)
        super.x -=567;
        if(super.x <0)
        super.x +=567;
        if(super.y >567)
            super.y -=567;
        if(super.y < 0)
            super.y +=567;
        super.x += xspeed ;
        super.y += yspeed ;
    }
}
class Listener implements KeyListener
{
    public void keyPressed(KeyEvent ev) 
    {
        if(ev.getKeyCode() == KeyEvent.VK_W)
        {   
            MoveBall.canvas.ball.xspeed = 0 ;
            MoveBall.canvas.ball.yspeed = -1 ; 
        }   
        if(ev.getKeyCode() == KeyEvent.VK_A)
        {   
            MoveBall.canvas.ball.xspeed = -1 ;
            MoveBall.canvas.ball.yspeed = 0 ; 
        }   
        if(ev.getKeyCode() == KeyEvent.VK_S)
        {   
            MoveBall.canvas.ball.xspeed = 0 ;
            MoveBall.canvas.ball.yspeed = 1 ; 
        }   
        if(ev.getKeyCode() == KeyEvent.VK_D)
        {   
            MoveBall.canvas.ball.xspeed = 1 ;
            MoveBall.canvas.ball.yspeed = 0 ; 
        }   

    }
    public void keyReleased(KeyEvent arg0){}
    public void keyTyped(KeyEvent arg0){}
}
camickr

ただし、ユーザーがキーを押しても何も起こりません。

KeyListenerを使用しないでください。KeyListenerは、コンポーネントにフォーカスがある場合にのみ機能するため、コンポーネントにフォーカスがないと思います。

代わりにを使用するKey Bindingsと、コンポーネントにフォーカスがない場合でもキーボードが機能します。

両方のアプローチの詳細については、「キーボード使用したモーション」を参照してください両方のアプローチの作業コードと同様に。

また:

  1. カスタムペイントはpaintComponent(...)、paint(...)ではなく、オーバーライドして実行する必要があります最初にsuper.paintComponent(...)を呼び出す必要があります。この場合、JComponentを拡張しているため、背景は自動的にクリアされません。代わりに、ボールをペイントする前に、fillRect(...)ステートメントを追加してコンポーネントの背景をペイントする必要があります。
  2. アニメーションにScheduledThreadPoolExecutorを使用しないでください。GUIコンポーネントの状態の更新は、イベントディスパッチスレッドで行う必要があります。スイングタイマーを使用する必要があります。

見てみましょうSwingのチュートリアルをCustom PaintingHow to Use Swing Timersを始めるためのセクションがあります。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

キーボードを使用して画像を移動する-Java

分類Dev

マウスまたはキーボードを使用してJava3Dで3Dモデルを移動する方法

分類Dev

Javaアプレットを使用して矢印キーでボールを移動する

分類Dev

キーボードの矢印とmouseEventを使用して、Javaでグラフィックを移動します

分類Dev

Javaでキーボードキーを使用してjButtonを押す方法は?

分類Dev

forループを使用してtxtファイルJavaの行を移動する方法

分類Dev

SAP GUI for Java 7.30 rev2-OS-X-Javascriptを使用してスペースバーのキー押下をコンボボックスに送信する任意の方法

分類Dev

Javaを使用してappiumでキーボードを閉じる方法は?

分類Dev

Java GUIは、1つのボタンを使用して複数のテキストフィールドをテキストファイルに追加しますか?

分類Dev

Javaでキーを押しながら画像を移動する方法。

分類Dev

Javaを使用してファイルを1つずつ移動する方法

分類Dev

AEMアセットJavaのワークフローでフォルダーを作成してファイルを移動する方法はありますか

分類Dev

Javaでキーストアを使用して秘密キーを保存する方法は?

分類Dev

Javaを使用してファイルをHDFSに移動する

分類Dev

Scala / Javaを使用してApache MINA FTPサーバーを起動する方法は?

分類Dev

Javaキーストアツールを使用してキーストア生成を自動化する方法 ユーザー操作なし

分類Dev

セレンを使用してページ間を移動する-Java

分類Dev

ストリームでJava 8 foreachループを使用して次のアイテムに移動する

分類Dev

シンプルなAndroid TextViewを作成し、Javaコードを使用してテキストを表示する方法は?

分類Dev

Java DSLを使用してリモートS(ftp)で処理済みファイルを移動する

分類Dev

Javaを使用してWord文書に動的テーブルを作成する方法

分類Dev

Javaを使用してIText7で画像を(テキスト/画像の)前面に移動する、または(テキスト/画像の)背面に送信する方法

分類Dev

paintcomponentを使用して複数のボールを作成するJava

分類Dev

JavaでMVCパターンを使用してGUIを更新する方法

分類Dev

JavaでRSAキーを使用して暗号化を解除する方法

分類Dev

for ループを使用して Java で x パターンを出力する方法は?

分類Dev

Javaゲームはスレッドを使用して画面上で物事を移動し、速度を落とします

分類Dev

Javaコードを使用してWebLogicサーバーを起動する方法

分類Dev

AlexaスキルでJavaを使用してAmazonユーザーのメールを取得する方法

Related 関連記事

  1. 1

    キーボードを使用して画像を移動する-Java

  2. 2

    マウスまたはキーボードを使用してJava3Dで3Dモデルを移動する方法

  3. 3

    Javaアプレットを使用して矢印キーでボールを移動する

  4. 4

    キーボードの矢印とmouseEventを使用して、Javaでグラフィックを移動します

  5. 5

    Javaでキーボードキーを使用してjButtonを押す方法は?

  6. 6

    forループを使用してtxtファイルJavaの行を移動する方法

  7. 7

    SAP GUI for Java 7.30 rev2-OS-X-Javascriptを使用してスペースバーのキー押下をコンボボックスに送信する任意の方法

  8. 8

    Javaを使用してappiumでキーボードを閉じる方法は?

  9. 9

    Java GUIは、1つのボタンを使用して複数のテキストフィールドをテキストファイルに追加しますか?

  10. 10

    Javaでキーを押しながら画像を移動する方法。

  11. 11

    Javaを使用してファイルを1つずつ移動する方法

  12. 12

    AEMアセットJavaのワークフローでフォルダーを作成してファイルを移動する方法はありますか

  13. 13

    Javaでキーストアを使用して秘密キーを保存する方法は?

  14. 14

    Javaを使用してファイルをHDFSに移動する

  15. 15

    Scala / Javaを使用してApache MINA FTPサーバーを起動する方法は?

  16. 16

    Javaキーストアツールを使用してキーストア生成を自動化する方法 ユーザー操作なし

  17. 17

    セレンを使用してページ間を移動する-Java

  18. 18

    ストリームでJava 8 foreachループを使用して次のアイテムに移動する

  19. 19

    シンプルなAndroid TextViewを作成し、Javaコードを使用してテキストを表示する方法は?

  20. 20

    Java DSLを使用してリモートS(ftp)で処理済みファイルを移動する

  21. 21

    Javaを使用してWord文書に動的テーブルを作成する方法

  22. 22

    Javaを使用してIText7で画像を(テキスト/画像の)前面に移動する、または(テキスト/画像の)背面に送信する方法

  23. 23

    paintcomponentを使用して複数のボールを作成するJava

  24. 24

    JavaでMVCパターンを使用してGUIを更新する方法

  25. 25

    JavaでRSAキーを使用して暗号化を解除する方法

  26. 26

    for ループを使用して Java で x パターンを出力する方法は?

  27. 27

    Javaゲームはスレッドを使用して画面上で物事を移動し、速度を落とします

  28. 28

    Javaコードを使用してWebLogicサーバーを起動する方法

  29. 29

    AlexaスキルでJavaを使用してAmazonユーザーのメールを取得する方法

ホットタグ

アーカイブ