1

私はJavaのドキュメントを読んでいて、主要なリスナーとその使用法を理解しようとしています。「w」と「s」で背景色を切り替える簡単なプログラムを作成できましたが、ペイントしたボールを動かそうとすると反応しなくなりました。JavaDocs の一般的な描画の問題を読んだので、これは描画の問題ではないと確信しています。JFrameをフォーカス可能に設定しました(または、少なくとも私は持っていると思います)。誰かが私を正しい方向に向けることができれば、それは大歓迎です。

メインクラスはこちら

import javax.swing.JFrame;
import java.awt.EventQueue;

public class frame {

    public static void main(String[] args){

         EventQueue.invokeLater(new Runnable()
         {                 
            @Override
             public void run()
             {       
                 showGui();                                                   
             }
         });        
    }

    public static void showGui(){
        JFrame f = new JFrame("Testing..");
         f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
          f.setFocusable(true);
            f.add(new Gui());
            f.setSize(300,300);
            f.setVisible(true);              
    }
}

および Gui/KeyListener クラス

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.BorderFactory;
import javax.swing.JPanel;

@SuppressWarnings("serial")
public class Gui extends JPanel {

    public Gui(){
        HandlerClass handle = new HandlerClass();
         setBorder(BorderFactory.createLineBorder(Color.black));
         addKeyListener(handle);
    }

    int x = 30;
    int y = 30;

    public void paintComponent(Graphics g){
        super.paintComponents(g);
        g.setColor(Color.BLUE);
        g.fillRect(x, y, 20, 20);   


    }

    private class HandlerClass implements KeyListener{

        public void keyTyped(KeyEvent e) {
            switch (e.getKeyChar()){
            case 'w': 
            repaint(x,y+1, 20,20);
                break;
            case 's': 
                repaint(x,y-1, 20,20);
                System.out.println("testing if this fires");
            break;
            }               
        }

        public void keyPressed(KeyEvent e) {
            //todo
        }
        public void keyReleased(KeyEvent e) {
            //todo

        }

    }

}

正しい方向への指摘は非常に役に立ちます、ありがとう。

4

3 に答える 3

2

このサイトをまったく検索したことがある場合は、この解決策を既に知っているでしょう。KeyListeners ではなく Key Bindings を使用します。このサイトをまだ検索していない場合は、質問する前に検索しておくべきでした。

例:コード例を含む私の以前の回答

于 2013-04-26T01:48:18.373 に答える
2

KeyListenerアタッチされているコンポーネントがフォーカス可能で、フォーカスがある場合にのみ、キー イベントに応答します。

JPanelデフォルトでは、これらの要件のいずれも満たしていません (デフォルトでは、フォーカス可能ではありません)。

これらの理由から、 を使用することはお勧めしませんKeyListenerが、代わりに、これらの問題を克服する機能を持つKey Bindingsを使用してください。

于 2013-04-26T01:48:34.920 に答える
0
repaint(x,y+1, 20,20);

少し高くペイントyしていますが、実際には変化していませんy。試す:

repaint(x,++y, 20,20);

他のリスナーにも同じことが(反対方向に)当てはまります。

于 2013-04-26T01:49:26.940 に答える