【问题标题】:Move a rectangle using arrow keys使用箭头键移动矩形
【发布时间】:2015-05-10 13:04:03
【问题描述】:

我正在尝试开发一个简单的游戏,您可以在其中使用左右箭头键移动矩形并使用空格键进行射击。

我添加了KeyListener 和其他人,但是当我运行它时,我没有任何作为按键或其他人的输出。

我有两个班级:

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);

    }
}

PaintComponent 类:

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) {

    }
}

拍摄方法不完整。

【问题讨论】:

  • 那么当你按向左或向右时会发生什么?矩形会移动吗?
  • 没有任何事情发生!
  • 矩形是否显示?
  • 是的,矩形是可见的!

标签: java keylistener keyevent


【解决方案1】:

这里将repaint()改为paintComponent,并添加Graphics g = getGraphics();

public void moveRec(KeyEvent evt){
    switch(evt.getKeyCode()){
        case KeyEvent.VK_LEFT:
            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 g = getGraphics();
            paintComponent(g);
            break;
    }
}    

让我知道这是否有效:)



编辑:
添加这一行

this.setFocusable(true);

到 PaintComponent 构造函数,它会使按键通过。

【讨论】:

  • 我不知道如何应用此更改!
  • 什么都没发生! :( 我已经写了 system.out.println("test") 来测试我的 keylistener 是否正常工作!但不是!我的意思是它没有写“test”!
  • 我应用了更改,但它不起作用! case KeyEvent.VK_LEFT: System.out.println("test"); dx -= 2; rec.setRect(dx, dy, 30, 10);图形 g = getGraphics();油漆组件(g);休息;案例 KeyEvent.VK_RIGHT: dx += 2; rec.setRect(dx, dy, 30, 10);图形 g2 = getGraphics();油漆组件(g2);休息;
  • 我不得不将 case 2 中的第二个图形重命名为 g2!没事吧?!
  • 是的。你添加了“this.setFocusable(true);”到 PaintComponent 构造函数?
【解决方案2】:

你忘了做两件事,第一件事是你的面板应该是可聚焦的,在你的PaintComponent构造函数中添加这个this.setFocusable(true)第二件事是你没有break开关盒,所以添加@987654324 @ 声明每个案例,那么它应该可以工作。

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;
}

【讨论】:

  • 你是否添加了 setFocusable(true)
  • 你在PaintComponent构造函数中添加了吗?
  • 成功了!!!! :D 我犯了一个错误,我之前在我的paintdemo 类中添加了 setfocusable() !!!非常感谢!