Java 使用箭头键移动矩形

Java 使用箭头键移动矩形,java,keylistener,keyevent,Java,Keylistener,Keyevent,我正在开发一个简单的游戏,你可以用左右箭头键移动一个矩形,用空格键射击 我添加了一个keylister和其他功能,但是当我运行它时,我没有任何功能作为按键或其他功能的输出 我有两门课: PaintDemo类: package game; import java.awt.BorderLayout; import java.awt.Color; import javax.swing.JFrame; import javax.swing.JPanel; public class PaintDemo

我正在开发一个简单的游戏,你可以用左右箭头键移动一个矩形,用空格键射击

我添加了一个
keylister
和其他功能,但是当我运行它时,我没有任何功能作为按键或其他功能的输出

我有两门课:

PaintDemo类:

package game;

import java.awt.BorderLayout;
import java.awt.Color;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class PaintDemo {

    public static void main(String[] args) {

        JFrame mainFrame = new JFrame("Game 1.1");
        mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mainFrame.setBounds(10, 10, 400, 400);
        mainFrame.setLayout(new BorderLayout());

        JPanel mainPanel = new JPanel();
        mainPanel.setBackground(Color.WHITE);

        PaintComponent paintPanel = new PaintComponent();

        mainFrame.add(mainPanel, BorderLayout.PAGE_START);
        mainFrame.add(paintPanel, BorderLayout.CENTER);

        mainFrame.setVisible(true);

    }
}
package game;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.geom.Rectangle2D;
import javax.swing.JPanel;


public class PaintComponent extends JPanel implements KeyListener {
    int dx = 200;
    int dy = 300;
    int my = 300;
    public Rectangle2D rec = new Rectangle2D.Double(dx , dy, 30, 10);

    public PaintComponent() {
        this.addKeyListener(this);
        this.setBackground(Color.white);
    }

    public void shoot(KeyEvent evt){
        if (evt.getKeyCode() == KeyEvent.VK_SPACE){
        my -= 7;
        repaint();
        }
    }

    public void moveRec(KeyEvent evt){
        switch(evt.getKeyCode()){
            case KeyEvent.VK_LEFT:
                System.out.println("test");
                dx -= 2;
                rec.setRect(dx, dy, 30, 10);
                repaint();
            case KeyEvent.VK_RIGHT:
                dx += 2;
                rec.setRect(dx, dy, 30, 10);
                repaint();
        }
    }

    @Override
    protected void paintComponent(Graphics grphcs){
        super.paintComponent(grphcs);
        Graphics2D gr = (Graphics2D) grphcs;
        gr.draw(rec);
    }


    @Override
    public void keyTyped(KeyEvent e) {
        System.out.println("2");
        shoot(e);
    }


    @Override
    public void keyPressed(KeyEvent e) {
        moveRec(e);

    }

    @Override
    public void keyReleased(KeyEvent e) {

    }
}
PaintComponent类:

package game;

import java.awt.BorderLayout;
import java.awt.Color;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class PaintDemo {

    public static void main(String[] args) {

        JFrame mainFrame = new JFrame("Game 1.1");
        mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mainFrame.setBounds(10, 10, 400, 400);
        mainFrame.setLayout(new BorderLayout());

        JPanel mainPanel = new JPanel();
        mainPanel.setBackground(Color.WHITE);

        PaintComponent paintPanel = new PaintComponent();

        mainFrame.add(mainPanel, BorderLayout.PAGE_START);
        mainFrame.add(paintPanel, BorderLayout.CENTER);

        mainFrame.setVisible(true);

    }
}
package game;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.geom.Rectangle2D;
import javax.swing.JPanel;


public class PaintComponent extends JPanel implements KeyListener {
    int dx = 200;
    int dy = 300;
    int my = 300;
    public Rectangle2D rec = new Rectangle2D.Double(dx , dy, 30, 10);

    public PaintComponent() {
        this.addKeyListener(this);
        this.setBackground(Color.white);
    }

    public void shoot(KeyEvent evt){
        if (evt.getKeyCode() == KeyEvent.VK_SPACE){
        my -= 7;
        repaint();
        }
    }

    public void moveRec(KeyEvent evt){
        switch(evt.getKeyCode()){
            case KeyEvent.VK_LEFT:
                System.out.println("test");
                dx -= 2;
                rec.setRect(dx, dy, 30, 10);
                repaint();
            case KeyEvent.VK_RIGHT:
                dx += 2;
                rec.setRect(dx, dy, 30, 10);
                repaint();
        }
    }

    @Override
    protected void paintComponent(Graphics grphcs){
        super.paintComponent(grphcs);
        Graphics2D gr = (Graphics2D) grphcs;
        gr.draw(rec);
    }


    @Override
    public void keyTyped(KeyEvent e) {
        System.out.println("2");
        shoot(e);
    }


    @Override
    public void keyPressed(KeyEvent e) {
        moveRec(e);

    }

    @Override
    public void keyReleased(KeyEvent e) {

    }
}
拍摄方法未完成。

将repaint()更改为此处的paintComponent,并添加图形g=getGraphics()

让我知道这是否有效:)



编辑:
添加这一行

this.setFocusable(true);

对于PaintComponent构造函数,它将使按键通过。

您忘记做两件事,第一件是您的面板应该是可聚焦的,将此添加到您的
PaintComponent
构造函数
this.setFocusable(true)
中,第二件是您没有
断开开关盒,因此,为每种情况添加
break
语句,那么它应该可以工作

switch (evt.getKeyCode()) {
case KeyEvent.VK_LEFT:
    System.out.println("test");
    dx -= 2;
    rec.setRect(dx, dy, 30, 10);
    repaint();
    break;
case KeyEvent.VK_RIGHT:
    dx += 2;
    rec.setRect(dx, dy, 30, 10);
    repaint();
    break;
}

当你按左键或右键时会发生什么?矩形移动了吗?没有任何事情发生!是否显示矩形?是,矩形可见!我不知道如何应用此更改!什么都没发生(我写了system.out.println(“test”)来测试我的keylistener是否工作!它不是!我的意思是它没有写“test”!我应用了更改,它不工作!case KeyEvent.VK_左:system.out.println(“test”);dx-=2;rec.setRect(dx,dy,30,10);Graphics g=getGraphics();paintComponent(g);break;case KeyEvent.VK_RIGHT:dx+=2;rec.setRect(dx,dy,30,10);Graphics g2=getGraphics();paintComponent(g2);break;我不得不将案例2中的第二个图形重命名为g2!可以吗?!是的。您添加了“this.setFocusable(true);”到PaintComponent构造函数?你添加了setFocusable(true)了吗?你在
PaintComponent
构造函数中添加了它了吗?它成功了!!!!:D我犯了一个错误,以前在我的paintdemo类中添加了setFocusable()!非常感谢!