アニメーションを表示するために円を連続的に再描画しています。私は、クリックすると円が異なる色になるようにしたいと思います。 MouseListenerを実装してmouseClickedイベントを取得しようとしたときに、動作しませんでした。私はそれが一定の再塗装に起因すると信じています。このサークルをバウンスさせてマウスクリックを捕まえる別の方法はありますか?私はテストするためにKeyEventを追加し、うまくいきました。これは別のプログラムから呼び出されたため、「メイン」はありません。キャンバス上でシェイプ上でmouseClickedイベントが頻繁に再描画される
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;
}
}
を見ている必要があります[マウスリスナーの作成方法](http://docs.oracle.com/javase/tutorial/uiswing/events/mouselistener.html) 'Canvas'を使用している理由は何ですか? 'java.awt.Canvas'を使用する主な理由は' BufferStrategy'を使うことです。そうでなければ、おそらく 'JPanel'を使用して空きのためにダブルバッファリングを得るべきです。 – MadProgrammer
また、イベント処理は本当にです実際には日付が – MadProgrammer
となっています。基本的な問題は、タイマーとイベントディスパッチスレッド間の競合状態になる可能性があります。マウスイベントについて通知された時点で、その位置は既に更新されています。クリティカルエリアの周りのスイングタイマーや同期ブロックを使用している可能性があります – MadProgrammer