这个MouseMotionListener貌似没起作用,请高手帮我看看
importjava.applet.Applet;importjava.awt.Color;importjava.awt.Font;importjava.awt.Grap...
import java.applet.Applet;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
public class test extends Applet implements MouseMotionListener {
// 图片
Image back1_img=null;
Graphics g1=null;
// 菜单
String menu[] = { "开始游戏", "关于游戏", "退出游戏" };
// 改变y值,判断菜单项
int menuy[] = { 55, 55 + 80, 55 + 160 };
int index = 0;
// 鼠标的位置
int mx, my;
// 是否显示选中状态
boolean isShow = false;
// **********************初始化参数******************//
public void init() {
//获得图片
back1_img = this.getImage(this.getCodeBase(), "back1.jpg");
// 加载图片
MediaTracker mt = new MediaTracker(this);
mt.addImage(back1_img, 0);
try {
mt.waitForAll();
} catch (InterruptedException e) {
e.printStackTrace();
}
this.setSize(300,300);
this.addMouseMotionListener(this);
g1=this.getGraphics();
}
// paint方法
public void paint(Graphics g1){
this.g1=g1;
g1.clearRect(0, 0,300,300);
//绘制背景图片
g1.drawImage(back1_img , 0, 0, 300,300, this);
//绘制文字
g1.setFont(new Font("宋体", Font.BOLD, 15));
g1.setColor(Color.yellow);
for (int i = 0; i < 3; i++) {
g1.drawString(menu[i], 120, i * 80 + 80);
}
// 绘制矩形
if (isShow) {
g1.setColor(new Color(214, 220, 201, 100));
g1.fillRect(120, menuy[index], 80, 40);
}
}
//// 区域判断
public boolean isRec(int x, int y, int w, int h) {
if (mx >= x && mx <= (x + w) && my >= y && my <= (y + h))
return true;
return false;
}
public void mouseDragged(MouseEvent arg0) {
}
public void mouseMoved(MouseEvent e) {
mx = e.getX();
my = e.getY();
for (int i = 0; i < 3; i++) {
// 判断在某个具体的菜单上
if (isRec(160, menuy[i], 80, 40)) {
isShow = true;
// 通过下标传递,绘制相应的矩形
index = i;
break;
} else {
isShow = false;
}
}
g1.setFont(new Font("宋体", Font.BOLD, 15));
g1.setColor(Color.yellow);
g1.drawString("aaaaaaaaaaaaaaaaaaaaa", 200, 300);
}
}
我想做的是在一张图片上加“开始游戏”“关于”“退出游戏”的字。鼠标移到哪个字上,那个字的周围会有一个矩形变色,相当于显示被选中。但是我写了这个,鼠标移上去没反应。
我就在最后mouseMoved()里面加了显示“aaaaaaaaaa”运行起来也没显示出来,所以我认为是MouseMotionListener没起作用。请高手指教下,怎么改。图片可以找一张别的代替下,或者不加图片貌似也不影响。只是那字的效果不出现让我头疼,想不通啊~~
请高手指教 展开
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
public class test extends Applet implements MouseMotionListener {
// 图片
Image back1_img=null;
Graphics g1=null;
// 菜单
String menu[] = { "开始游戏", "关于游戏", "退出游戏" };
// 改变y值,判断菜单项
int menuy[] = { 55, 55 + 80, 55 + 160 };
int index = 0;
// 鼠标的位置
int mx, my;
// 是否显示选中状态
boolean isShow = false;
// **********************初始化参数******************//
public void init() {
//获得图片
back1_img = this.getImage(this.getCodeBase(), "back1.jpg");
// 加载图片
MediaTracker mt = new MediaTracker(this);
mt.addImage(back1_img, 0);
try {
mt.waitForAll();
} catch (InterruptedException e) {
e.printStackTrace();
}
this.setSize(300,300);
this.addMouseMotionListener(this);
g1=this.getGraphics();
}
// paint方法
public void paint(Graphics g1){
this.g1=g1;
g1.clearRect(0, 0,300,300);
//绘制背景图片
g1.drawImage(back1_img , 0, 0, 300,300, this);
//绘制文字
g1.setFont(new Font("宋体", Font.BOLD, 15));
g1.setColor(Color.yellow);
for (int i = 0; i < 3; i++) {
g1.drawString(menu[i], 120, i * 80 + 80);
}
// 绘制矩形
if (isShow) {
g1.setColor(new Color(214, 220, 201, 100));
g1.fillRect(120, menuy[index], 80, 40);
}
}
//// 区域判断
public boolean isRec(int x, int y, int w, int h) {
if (mx >= x && mx <= (x + w) && my >= y && my <= (y + h))
return true;
return false;
}
public void mouseDragged(MouseEvent arg0) {
}
public void mouseMoved(MouseEvent e) {
mx = e.getX();
my = e.getY();
for (int i = 0; i < 3; i++) {
// 判断在某个具体的菜单上
if (isRec(160, menuy[i], 80, 40)) {
isShow = true;
// 通过下标传递,绘制相应的矩形
index = i;
break;
} else {
isShow = false;
}
}
g1.setFont(new Font("宋体", Font.BOLD, 15));
g1.setColor(Color.yellow);
g1.drawString("aaaaaaaaaaaaaaaaaaaaa", 200, 300);
}
}
我想做的是在一张图片上加“开始游戏”“关于”“退出游戏”的字。鼠标移到哪个字上,那个字的周围会有一个矩形变色,相当于显示被选中。但是我写了这个,鼠标移上去没反应。
我就在最后mouseMoved()里面加了显示“aaaaaaaaaa”运行起来也没显示出来,所以我认为是MouseMotionListener没起作用。请高手指教下,怎么改。图片可以找一张别的代替下,或者不加图片貌似也不影响。只是那字的效果不出现让我头疼,想不通啊~~
请高手指教 展开
1个回答
展开全部
如果我要确定一个方法是否有进入,首先做的是在这个方法的一开始打印一句System.out.println("aaaaa");其次想到的是调试,我不会在界面上画一串字符,尤其是当你界面本身就是问题所在的时候,更不该相信界面给你的信息,所以你用g1.drawString作为调试信息可以说是一个失误。。。
事实上,你在mouseMoved里面加System.out.println就会发现这个方法的确进入了,并且当鼠标移动时不断在被调用。
最后来说问题的关键,也是导致g1.drawString不起作用的原因。因为Graphics对象一般都是在绘制过程中用到,他会作为paint方法的参数传递给你,绘制完之后很可能被丢弃,你保留着他的引用是没用的,当一次绘制完成后,你再用那个对象绘制是不会起作用的。正确的做法是,在mouseMoved方法中判断到需要重新绘制时调用repaint(),成员变量g1可以去掉。
不过尽管我这么做后,效果还是不太好,有点卡。。。不知道是不是鼠标移动事件太多,绘制跟不上。。。不过至少灰色的矩形框已经出来了~
事实上,你在mouseMoved里面加System.out.println就会发现这个方法的确进入了,并且当鼠标移动时不断在被调用。
最后来说问题的关键,也是导致g1.drawString不起作用的原因。因为Graphics对象一般都是在绘制过程中用到,他会作为paint方法的参数传递给你,绘制完之后很可能被丢弃,你保留着他的引用是没用的,当一次绘制完成后,你再用那个对象绘制是不会起作用的。正确的做法是,在mouseMoved方法中判断到需要重新绘制时调用repaint(),成员变量g1可以去掉。
不过尽管我这么做后,效果还是不太好,有点卡。。。不知道是不是鼠标移动事件太多,绘制跟不上。。。不过至少灰色的矩形框已经出来了~
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询