2

専用のフレームクラスと専用のパネルクラスがあります。「右」キー(->)のキー押下をリッスンするキーリスナー設定があり、次に再描画を呼び出しますが、「右」キーを押しても何も起こりません。キーリスナーは適切に実行されていると思うので、repaint()を呼び出す方法である必要があると思います。これを修正する方法を教えてください。

編集*作成したincX()メソッドとincY()メソッドを呼び出す方法が見つからなかったため、CircleFrameのxとyを静的にしたことを追加したいと思います。これは、元々、パネルの作成がCircleBoxのコンストラクターで行われたためです。パネルのrepaint()を呼び出す方法を用意するために、それを取り出してmainに配置しましたが、機能しませんでした。ここに欠けている重要なステップがあるように感じます。

package circlebox;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.util.Random;

public class CircleBox extends JFrame implements KeyListener {
    CircleBox() {

    }

    public void keyPressed(KeyEvent e) {
        int location = e.getKeyLocation();
        if(location == KeyEvent.KEY_LOCATION_NUMPAD) {
            CircleFrame.y += 1;
            repaint();
        }
    }

    public void keyReleased(KeyEvent e) {

    }

    public void keyTyped(KeyEvent e) {

    }

    public static void main(String[] args) {
        CircleBox frame = new CircleBox();
        frame.setSize(400,400);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        CircleFrame frame2 = new CircleFrame();
        frame.setLayout(new GridLayout(1,1));
        frame.add(frame2);

        frame.setVisible(true);
    }
}

class CircleFrame extends JPanel {
    static int x = 20;
    static int y = 20;
    int radius = 20;

    CircleFrame() {
        setSize(400,400);
    }

    @Override
    protected void paintComponent(Graphics g) {
        g.drawOval(x,y,radius,radius);
    }

    public void incX(int inc) {
        x += inc;
    }

    public void incY(int inc) {
        y += inc;
    }

    public int checkCollisions() {
        if(x <= 0) {
            return 0;
        }
        else if(y <= 0) {
            return 1;
        }
        else if(x >= 400) {
            return 2;
        }
        else if(y >= 400) {
            return 3;
        }
        else {
            return -1;
        }
    }
}
4

1 に答える 1

3

あなたの再描画はうまく機能しています。問題はキーリスナーにあります。

まず、実際にキー リスナーを登録する必要があります。したがって、CircleBoxコンストラクターに次の行を追加します。

addKeyListener(this);

次に、keyPressed正しく処理する必要があります。

public void keyPressed(KeyEvent e) {
    // TODO: your are actually moving the circle down, so it should be VK_DOWN
    if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
        CircleFrame.y += 1;
        repaint();
    }
}
于 2012-10-30T06:42:49.593 に答える