【发布时间】:2016-04-11 01:47:50
【问题描述】:
我有一个不断重绘的圆圈以显示动画。如果单击,我想让圆圈闪烁不同的颜色。当我尝试实现 MouseListener 以获取 mouseClicked 事件时,它不起作用。我相信这是由于不断的重新粉刷。有没有另一种方法可以让这个圆圈反弹并仍然抓住鼠标点击?我添加了一个 KeyEvent 来测试,它工作正常。没有“main”,因为这是从另一个程序调用的。
import java.awt.*;
import java.awt.event.KeyEvent;
import java.util.Random;
import java.util.Timer;
public class Catch extends Canvas {
int xCor, yCor, xMove, yMove;
Color currentColor;
Random ranNumber;
boolean flashing = false;
public Catch() {
enableEvents(java.awt.AWTEvent.KEY_EVENT_MASK);
requestFocus();
xCor = 500;
yCor = 350;
xMove = 5;
yMove = 5;
currentColor = Color.black;
ranNumber = new Random();
Timer t = new Timer(true);
t.schedule(new java.util.TimerTask() {
public void run() {
animate();
repaint();
}
}, 10, 10);
}
public void paint(Graphics g) {
g.setColor(currentColor);
g.fillOval(xCor, yCor, 20, 20);
}
public void processKeyEvent(KeyEvent e) {
if (e.getID() == KeyEvent.KEY_PRESSED) {
if (e.getKeyCode() == KeyEvent.VK_SPACE) {
flashing = !flashing;
}
}
}
public void animate() {
xCor += xMove;
yCor += yMove;
// and bounce if we hit a wall
if (xCor < 0 || xCor + 20 > 1000) {
xMove = -xMove;
}
if (yCor < 0 || yCor + 20 > 700) {
yMove = -yMove;
}
if (flashing) {
int r = ranNumber.nextInt(256);
int g = ranNumber.nextInt(256);
int b = ranNumber.nextInt(256);
currentColor = new Color(r, g, b);
}
}
public boolean isFocusable() {
return true;
}
}
【问题讨论】:
-
How to Write a Mouse Listener?你有什么理由使用
Canvas?我只问,因为使用java.awt.Canvas的主要原因是使用BufferStrategy,否则您可能应该使用JPanel并免费获得双缓冲 -
另外,你的事件处理真的,真的过时了
-
您的基本问题也可能是计时器和事件调度线程之间的竞争条件,因此当您收到有关鼠标事件的通知时,它的位置已经更新。可能在关键区域周围使用 Swing
Timer或同步块可能会有所帮助 -
我想我使用
Canvas的唯一原因是我在“绘画”时被教导要使用的东西。我的任何代码“过时”都不会让我感到惊讶。我已经有一段时间没有编码了。然而,我很高兴学习更好、更现代的做事方式。我以前没有使用过同步块。我会在那里做一些研究。
标签: java awt mouseclick-event