web-dev-qa-db-ja.com

Javaでキー押下を検出する方法

学習中の息子(11歳)=​​Javaは質問とコードを入力します。サイトでこの質問に対する答えを見つけることができなかったと言っています。彼の質問の編集版を読んでください。

Javaでキー押下を検出するにはどうすればよいですか?My IDEはEclipseと呼ばれ、いくつかのクラスを作成しました。インターネットのkeyconfigofplayer内のコードを見つけて、プレーヤークラスを拡張します。キーを押したままにすると、長方形または楕円形が画面上を移動しますが、どうすればよいですか?何らかの理由で、コードを正しく入力できず、インポートにアスタリスクが表示されません気の毒です。ごめんなさい。無視してください。私はそれを修正できません:(。ここに私のコードがあります:

ウィンドウのコード:

import javax.swing.*;
import Java.awt.*;

public class window {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);
        f.setSize(600, 600);
        player p = new player();
        f.add(p);

        keyconfigofplayer key = new keyconfigofplayer();
        p.add(key);
        f.add(key);

    }
}

//this class is the player graphic

import javax.swing.*;
import Java.awt.*;

    public class player extends JPanel {

    int x = 50;
    int y = 50;

    public void Paint() {//This is where the graphic is painted to the screen
        repaint();
    }

    public void paintComponent(Graphics g) {
        //This is where the graphic is 'manufactured'
        super.paintComponent(g);
        g.setColor(Color.GREEN);
        int width = 20;
        int height = 20;
        g.fillRect(x, y, width, height);

        int width2 = 10;
        int height2 = 10;
        g.fillOval(x, y, width2, height2);

    }
}

//the keyconfigofplayer class(where i think the problems are):
//this class is the player graphic

import javax.swing.*;
import Java.awt.*;

    public class player extends JPanel {

    int x = 50;
    int y = 50;

    public void Paint() {//This is where the graphic is painted to the screen
        repaint();
    }

    public void paintComponent(Graphics g) {
        //This is where the graphic is 'manufactured'
        super.paintComponent(g);
        g.setColor(Color.GREEN);
        int width = 20;
        int height = 20;
        g.fillRect(x, y, width, height);

        int width2 = 10;
        int height2 = 10;
        g.fillOval(x, y, width2, height2);
    }
}

私がよくコメントしようとしたクラスは、あなたがそれが何を意味するかを知っています。 YouTubeチャンネルmacheads101からkeyconfigofplayerのコードを取得しました。GUIをJavaエピソード12または11でプログラムする方法です。私の問題は、画像を更新することではなく、キーが検出されることですだから、このキーが押されたら、x座標に+ 10が完了するまで位置を更新し、絶えず位置を更新するようにwhileループを作成する必要があるかもしれません。 private and void?私はそれらを理解できません:(そして、私が拡張プレイヤーを正しく実装した場合、私はmacheads101のコードを慎重に変更しようとしましたが、それを正確にコピーしたときもうまくいきませんでした。あなたが私の質問に答えて、コードを変更するのを手伝ってくれたなら、私は感謝します。最終的には、アーケードゲーム「スペースインベーダー」や「ドラゴンシューター」のようなシューティングゲームになります。

9
user3343497

Java.awt.event.KeyListenerについて読む

コードは次のようになります。

    f.addKeyListener(new KeyListener() {
        @Override
        public void keyTyped(KeyEvent e) {
        }

        @Override
        public void keyPressed(KeyEvent e) {
            System.out.println("Key pressed code=" + e.getKeyCode() + ", char=" + e.getKeyChar());
        }

        @Override
        public void keyReleased(KeyEvent e) {
        }
    });
12
user3329098

したがって、GUIはイベント駆動型です。発生するすべてはイベントによって駆動されます。キーを押すことはイベントです。コンポーネントはイベントをリッスンし、イベントが発生したときに何かをする必要があります。さまざまなリスナーの作成方法について詳しく読むことができます hereKeyListenerMouseListenerのように、いくつかの基本的なリスナーは(名前で)かなり簡単に認識できます。 ActionListenerは、ボタンを押すことでも非常に一般的です。チュートリアルを読んで、さまざまなリスナーを学びたいと思うでしょう。

ただし、SwingにはKeyListenerの使用に焦点の問題があるため、key bindingsを使用することをお勧めします。 KeyListenerチュートリアルで述べたように:

特定のキーに対する特別な反応を定義するには、キーリスナーの代わりにキーバインディングを使用します

キーバインディングのチュートリアルは here にあり、例は here 以下は、キーバインディングを使用してキーを押すと、長方形の動きを示す例のgifです。

enter image description here


[〜#〜] update [〜#〜]ただ注意してください。

  1. PaintJPanelメソッドをオーバーライドしないでください
  2. Never_Paint/paintComponent_メソッド内からrepaint()を呼び出す

    _public void Paint() {//This is where the graphic is painted to the screen
        repaint();
    }
    _

上記のコードを完全に取り除きます。

5
Paul Samsotha

スムーズに動作し、グローバルイベントをリッスンする素晴らしいライブラリがあります。それは私のために問題なく働いた唯一のものです: https://github.com/kwhat/jnativehook

システム内のすべてのイベントを取得するため、開発には非常に便利です。

次のように使用できます。

package main;

import org.jnativehook.GlobalScreen;
import org.jnativehook.NativeHookException;
import org.jnativehook.keyboard.NativeKeyEvent;
import org.jnativehook.keyboard.NativeKeyListener;

class MyKeyboard implements NativeKeyListener {

    public static void main(String[] args) {
        try {
            GlobalScreen.registerNativeHook();
        } catch (NativeHookException ex) {
            System.err.println("There was a problem registering the native hook.");
            System.err.println(ex.getMessage());

            System.exit(1);
        }

        GlobalScreen.addNativeKeyListener(new MyKeyboard());

        // Now press any keys and look at the output
    }

    @Override
    public void nativeKeyPressed(NativeKeyEvent e) {
    }

    @Override
    public void nativeKeyTyped(NativeKeyEvent nke) {
    }

    @Override
    public void nativeKeyReleased(NativeKeyEvent nke) {
    }

}
2
Rav

実際にキーが押されたことをリッスンしたり、xとyの位置を変更したりするコードはコードにありません。円は、xとyを変更してから画面を再描画した場合にのみ移動します。

ここでパネルなどを設定しましたが、実際にはユーザーのアクションに応答するものは何も追加していません。キーの押下に応答するには、おそらくどこかにKeyListenerを追加する必要があります。これはおそらく、あなたがしているチュートリアルか、前のチュートリアルまたは後のチュートリアルのいずれかです。

1
Tim B

KeyListener

Mainメソッドではなく、必要なクラス内にKeyListenerイベントを配置する必要があります。

addKeyListener(new KeyListener() {
    public void keyPressed(KeyEvent e) {
        //This is where you want to implement your key!
        if(e.getKeyCode() == KeyEvent.VK_SPACE){
             //Fire Gun!
        }
        ....
    }

    public void keyReleased(KeyEvent e) { //I dont really use these!
    }

    public void keyTyped(KeyEvent e) { //I dont really use these!
    }
});

キーの詳細はこちら: KeyListeners


パブリックおよびプライベート:

現在、パブリックおよびプライベートについては、StackOVerflowについて既に回答があります。 ここ


関数/メソッドおよびVoid:

Voidに関しては、何も返さない関数で使用されます!関数についてどの程度知っているかはわかりませんが、例を挙げましょう。

int sum;
public int addReturn(int x, int y){
    sum = x +y;
    return sum;
}

これは、xとyとして指定された2つの整数を加算し、合計を整数として返します。

Voidでできることは:

int sum;
public void add(int x, int y){
    sum = x+ y;
}

ここでは何も返しませんが、x + yを合計に格納します!

だからあなたのクラスで:

int Summation, x = 10, y = 10;
summation = addReturn(x,y); //<-- This will place summation = 10+10 = 20

Void関数の場合、変数を作成する必要はありません。値を返さず、関数内で値を設定するためです。あなたがする必要があるのはそれを呼び出すことです

add(x,y);

さらにヘルプが必要な場合は、コメントしてください! :)また、あなたの息子がJavaそんな若い頃にとても興味を持っているのは素晴らしいと思います。偉大な子育て:D

0
Shrey