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);
}
}
}我是爪哇新手。我试图专门为KeyListener做一个类,但是它不起作用。我不知道我做错了什么。
创建一个inputhandler类可能毫无意义,它只控制一个类(jpanel),但我过去常常将所有代码放在一个类中。看起来糟透了。我正在学习把它们变成更独立的类,或者使它们更面向对象~我只是混淆了什么时候创建一个新类,而不是什么时候。请帮帮我,你能告诉我我上面的代码做错了什么吗?我的想法是错的还是只是密码?
发布于 2013-10-23 22:53:10
这似乎是您的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。
https://stackoverflow.com/questions/19553351
复制相似问题