我有一个专门的框架类和一个专门的面板类。我有一个keylistener设置来监听“右”键的按键( - >)然后我调用重绘但是当我按下“右”键时没有任何反应。我相信我的keylistener已经完成了所以我认为它必须是我调用repaint()的方式;请告诉我如何解决这个问题。
编辑*我想补充说我在CircleFrame静态中创建了x和y,因为我找不到调用我编写的incX()和incY()方法的方法。这是因为,最初,面板的创建是在CircleBox的构造函数中完成的。我把它拿出来并把它放在main中以便有办法为面板调用repaint()但是这样做不起作用。我觉得这里缺少一些至关重要的一步。
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;
}
}
}
答案 0 :(得分: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();
}
}