JAVA J2M在屏幕上绘制一个黑色正方形

在屏幕上绘制一个黑色正方形,当用户按确定键时,此正方形随机向一方向持续移动,且当正方形碰撞到屏幕边缘时向反方向移动。当用户再次按确定键时正方形停止移动。//算是帮帮忙,还... 在屏幕上绘制一个黑色正方形,当用户按确定键时,此正方形随机向一方向持续移动,且当正方形碰撞到屏幕边缘时向反方向移动。当用户再次按确定键时正方形停止移动。
//算是帮帮忙,还有点小问题帮忙改改吧!
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Random;
import javax.swing.JFrame;

public class DirRectangle extends JFrame{

public static final int WIDTH = 600;
public static final int HEIGHT =600;
public static int x = 250;
public static int y = 250;
private boolean beEntered = false;
private int num = 0;
Random r = new Random();
private int count = 0;

public DirRectangle(){
setTitle("Black Move");
this.setSize(WIDTH,HEIGHT);
this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
this.setLocationRelativeTo(null);
this.addKeyListener(new enterListener());

new Thread(new paintThread()).start();
}

public static void main(String[] args) {
DirRectangle moveRec = new DirRectangle();
moveRec.setVisible(true);
}

public void paint(Graphics g) {
Image goffImage = null;
if(goffImage == null) goffImage = this.createImage(WIDTH, HEIGHT);
Graphics goff = goffImage.getGraphics();
goff.fillRect(x, y, 100, 100);
g.drawImage(goffImage, 0, 0, null);

if(beEntered) move();
}

private class enterListener extends KeyAdapter{
public void keyPressed(KeyEvent e) {
int put = e.getKeyCode();
switch(put){
case KeyEvent.VK_ENTER:
count++;
num = r.nextInt(3)+1;
break;
}
if(count %2 != 0) beEntered = true;
else beEntered = false;
}
}

public class paintThread implements Runnable{
public void run() {
while(true){
repaint();
try {
Thread.sleep(80);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

}

public void move(){

switch(num){
case 1:
x+=20;
break;
case 2:
x-=20;
break;
case 3:
y+=20;
break;
case 4:
y-=20;
break;
}
if(num == 1&& x >500) num = 2;
else if(num == 2&& x < 0) num = 1;
else if(num == 3&& y >500) num = 4;
else if(num == 4&& y <0) num = 3;
else return;
}
}
展开
 我来答
hanzsim
2009-10-23 · TA获得超过1540个赞
知道小有建树答主
回答量:922
采纳率:0%
帮助的人:1092万
展开全部
首先说,你的程序我没有拿来编译运行。只从源码看,就有一些问题。
从整体结构上看,程序架构应该是没有什么问题的。可各函数功能设计有明显问题,而且编程技巧上也不太高明。
你的线程run调用rapaint,paint调用move,这样不好。应该是run计算坐标,然后直接调用repaint,在paint中仅需要使用Graphics绘制就可以了。
在计算坐标时,使用了switch结构和if嵌套代码多,效率低。我以前编写类似广场漂移代码时,用的方法是:声明2个变量xStep、yStep,用于控制方块运动步长,线程每次休眠结束后,分别检查x、y是否到达边界,如x到达,将xStep取相反数;如y到达,将yStem取相反数。再将x+=xStemp,y+yStep,然后重绘即可。
你按我说的方法重写一下,看看哪种方法好。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式