質問: 現在Eclipseを使ってSwingでlauncherを制作しています。 画像ボタンになっていて、各ボタンを押すとそこに設定されているショートカットが起動する仕組みになっています。 AWTスレッドを使って 真ん中のボタンをクリックすると画像のように、各ボタンの位置が回るようにしたいです。(画像は表示するPictuerを変更しているだけ) ![イメージ説明](https://teratail.storage.googleapis.com/uploads/contributed_images/bad7e9000fdf47f24207d68e5d73a0b2.png) ![イメージ説明](https://teratail.storage.googleapis.com/uploads/contributed_images/d64b3b1ac4cb52f1ee367099ced7b116.png) ボタンの座標は固定してあり、サイズは位置によって計算して変化します。 どのようなクラスが必要なのか、どのようなソースになるのか、調べていますが全く分かりません アニメーションで表現したいのですがアニメーションをどう実現したらよいかわかりません。
回答: アニメーションというのはちょっとずつ違った画像を一定時間ごとに書き直すことで実現します。基本は「一定時間ごとに再描画の契機を設ける」ことと「時間経過に応じた図形内容の再計算・再描画」になります。再描画は適当なJComponentのpaintComponentメソッドに実装することになるでしょう。 * 一定時間ごとに再描画の契機を設ける java.awt.Timerを使うとよいでしょう。インターバルを指定できますので例えば0.1秒ごとに再描画といったことができます。 * アイコンの位置 時間経過に従い軌道中心からみた角度が変化すると考えればよいですね。一番奥の位置を0度、一番手前を180度と考えると以下の計算になります。角度の単位はラジアンなのでdegree(1周が360度)をパラメーターとしたいなら`radian = Math.toRadians(degree)`を使います。 int x = xCenter + (int)(Math.sin(角度)*軌道長半径) int y = yCenter - (int)(Math.cos(角度)*軌道短半径) * アイコンの大きさ 透視投影の考え方を用いて視点からの距離によって遠くにあるほど小さくなるような計算をします。視点からの距離をDとするとアイコンの見かけ上の大きさはDに反比例します。 double D = Dmin + (Dmax - Dmin) / 2 * Math.cos(角度) といった感じで距離が求められるのでそこからアイコンの大きさを計算します。アイコンの画像(java.awt.Image)をスケーリングしつつ描画するには例えば以下が使えるでしょう。 Graphics#drawImage(Image img, int x, int y, int width, int height, ImageObserver observer)