import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JPanel;
public class Panel extends JPanel {
/**
*
*/
private static final long serialVersionUID = 1L;
final static int WIDTH = 800;
final static int HEIGHT = 600;
private int x = 40, y = 49, r = 20;
Dimension SIZE = new Dimension(WIDTH, HEIGHT);
public Panel() {
setLayout(new BorderLayout());
setPreferredSize(SIZE);
setMaximumSize(SIZE);
setMinimumSize(SIZE);
setBackground(Color.cyan);
setFocusable(true);
requestFocus();
new input(this);
}
public void paint(Graphics g) {
super.paint(g);
Graphics2D g2 = (Graphics2D) g;
g2.fillOval(x, y, r, r);
repaint();
}
public int getX() {
return x;
}
public int getY() {
return y;
}
public void setX(int x) {
this.x = x;
}
public void setY(int y) {
this.y = y;
}
}
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
public class input extends KeyAdapter {
private Panel panel;
public input(Panel panel) {
panel = new Panel();
panel.addKeyListener(this);
}
@Override
public void keyPressed(KeyEvent e) {
int keycode = e.getKeyCode();
int x = panel.getX();
int y = panel.getY();
if (keycode == KeyEvent.VK_LEFT) {
panel.setX(x - 1);
}
if (keycode == KeyEvent.VK_RIGHT) {
panel.setX(x + 1);
}
}
}
我是Java新手。我试图专门为KeyListener创建一个类 但它只是不起作用。我无法弄清楚我做错了什么。
创建一个inputhandler类可能毫无意义,它只控制一个类(jpanel),但我曾经将我的所有代码放在一个单独的类中。它看起来很糟糕。我正在学习将它们分成更多单独的类或使它们更加面向对象〜 我只是在混淆何时创建一个新课程,何时没有。 请帮帮我,你能告诉我上面的代码我做错了什么吗?我的想法是错的还是只是代码?
答案 0 :(得分:0)
这看起来是KeyListener不起作用的第一个原因:
public input(Panel panel) {
panel = new Panel();
panel.addKeyListener(this);
}
执行此操作时:
new input(this);
因为你也是这样做的:
panel = new Panel();
您正在将KeyListener添加到new Panel()
,而不是您使用this
传递给构造函数的面板。
我个人认为创建一个监听器对象只是为了听,但我不认为这是必要的。
虽然这可能不会对你的听众造成影响,但我看到的另一个问题是你要重写你不应该在Swing中做的画。你应该重写paintComponent。请参阅在AWT和Swing中绘画:http://www.oracle.com/technetwork/java/painting-140037.html#callbacks
另外,就样式而言,类名在Java中以大写字母开头。您的input
课程应命名为Input
。