• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:javaアプレット)

Javaアプレットでマウス位置を取得して線を描画する方法

このQ&Aのポイント
  • Javaアプレットを使ってマウスの位置を取得し、線を描画する方法を教えてください。
  • マウスをクリックした位置を始点とし、もう一度クリックした位置まで線を引くアプレットを作成したいと思っています。
  • 現在のコードでは、マウスをクリックすると点が移動するだけで線が描画されません。x1=x2;y1=y2;がrepaint();よりも前に実行されるためだと思われます。どのように修正すれば良いでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • vaguechat
  • ベストアンサー率85% (47/55)
回答No.1

もちろんrepaint()がx1=x2;y1=y2;より先に実行されている。 ただComponentクラスのrepaintメソッドのAPIドキュメントによれば、 repaint()はpaintまたはupdateメソッドを「可能なかぎりすみやかに」呼び出します、とある。 つまり、repaint()は再描画を指示するだけ、つまり描画の予約をするだけで、 実際に再描画がいつ行われるかは(できるだけ早くやろうとはするだろうが)わからない。 したがって、質問者のコードだと再描画を指示した直後にx1とy2をx2,y2と等しくしてしまっているので、 その後実際にpaintが呼ばれて再描画が行われる時点では点しか描画されない。 この場合、問題点は、マウスを押した時にその時点での再描画のために必要なx2,y2の取得と、 「次に」マウスが押された時に必要になるx1,y1の値の設定を一緒に行っていることにある。 したがって、マウスが押されるたびに、その時の線の描画に必要なx1,y1,x2,y2を設定してから再描画を指示すればいい。 x1,y1は前回押されたときのx2,y2の値であるから、2回目以降においてx2,y2を更新する前にx1,y1にこれを代入すればいい。 そして1回目はx1,y1を更新するのでなく2回目以降でx1,y1として使うためのx2,y2を更新すればいい。 public void mousePressed(MouseEvent e) { n = n + 1; if (n == 1) { x2 = e.getX(); y2 = e.getY(); } else { x1 = x2; y1 = y2; x2 = e.getX(); y2 = e.getY(); repaint(); } } もう少しまとめられると思うがこのような感じで書けると思う。 ところで、これだとマウスを押すたびに新たな座標に対する線しかメモリーに残らないので、 もし描いた線を全部保存したいなら点の座標を記録して再描画のたびに全部の線を描くか、 オフスクリーンバッファに描画しておきそれを再描画のたびにコピーするかすればいい。

koun
質問者

お礼

ありがとうございます。実行したらできました。repaint();はいつ実行されるかわからないんですね。線を全部保存するのもやってみようと思います。

関連するQ&A