我一直在尝试让球在按下任意键时改变方向。如果球在按下按键时向侧面移动,球将开始向下移动,当它接触底部时,它会回到向上位置......我认为我已经编写了正确的代码,我找不到任何错误。 那么有人可以告诉我这段代码有什么问题吗?
import java.awt.BorderLayout;
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.Ellipse2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class ASS2 extends JFrame {
public static void main(String args[]) {
ASS2 g = new ASS2();
g.setLayout(new BorderLayout());
g.setSize(500, 500);
MyPanel mp = new MyPanel();
g.add(mp);
mp.setSize(500, 500);
mp.setBackground(Color.black);
//mp.addKeyListener(mp);
g.setVisible(true);
g.setDefaultCloseOperation(EXIT_ON_CLOSE);
}
}
class MyPanel extends JPanel implements KeyListener {
{
addKeyListener(this);
}
int xpos = 20, ypos = 200;
int xtop = 15, ytop = 15;
int xtemp = 250, ytemp = 250;
int xbot = 450, ybot = 400;
int flag = 1, flag1 = 1;
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.setColor(Color.white);
g2d.fill(new Ellipse2D.Double(xpos, ypos, 50, 50));
if (xpos < xbot && flag == 1) {
xpos++;
if (xpos == xbot) {
flag = 0;
}
} else if (xpos > xtop && flag == 0) {
xpos--;
if (xpos == xtop) {
flag = 1;
}
}
try {
Thread.sleep(05);
} catch (Exception e) {
}
repaint(1000);
}
public void keyPressed(KeyEvent ae) {
}
public void keyReleased(KeyEvent ae) {
Object t = ae.getKeyCode();
if (t.equals(KeyEvent.VK_DOWN)) {
if (ypos < ybot && flag1 == 1) {
ypos++;
if (ypos == ybot) {
flag1 = 0;
}
} else if (ypos > ytop && flag1 == 0) {
ypos--;
if (ypos == ytop) {
flag1 = 1;
}
}
repaint();
} else if (t.equals(KeyEvent.VK_RIGHT)) {
if (xpos < xbot && flag == 1) {
xpos++;
if (xpos == xbot) {
flag = 0;
}
} else if (xpos > xtop && flag == 0) {
xpos--;
if (xpos == xtop) {
flag = 0;
}
}
repaint();
}
}
}
最佳答案
欢迎来到“为什么你不应该使用 KeyListener
s”的奇妙世界。
基本上,KeyListener
仅当监听器附加到的组件可聚焦并且具有焦点时才会引发事件。
相反,您应该使用 Key Bindings这允许您控制触发关键事件的焦点级别。
- 请勿使用
Thread.sleep
在 EDT 中调用的任何方法中,尤其是paint
方法。 - 请勿调用
repaint(1000);
在任何绘制方法中或调用任何可能触发repaint
的方法从内部paint
方法 - 请勿修改
paint
内的状态方法,paint
方法绘制,仅此而已。 - 使用某种“更新”线程/进程,负责更新游戏模型并请求更新 View 。
java.swing.Timer
是一个不错的简单选择。请参阅How to use Swing Timers - Swing 时
Timer
变得限制你想要做的事情,你开始探索Thread
的使用s,不要修改 EDT 之外的任何 UI 组件。请参阅Concurrency in Swing了解更多详情 - 始终在 EDT 上下文中启动您的程序,请参阅 Initial Threads了解更多详情...
关于java - 按下键时改变球的方向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23028605/