スレッドを動かす方法とプログラムのアニメーション化

このQ&Aのポイント
  • プログラムをアニメーション化する方法とスレッドの動かし方について教えてください。
  • プログラムの動きがうまくいかない場合の対処法について知りたいです。
  • 提供されたプログラムの要点を把握し、スレッドを正しく動かす方法を教えてください。
回答を見る
  • ベストアンサー

スレッドを動かすには?

プログラムをアニメーションさせたいのですが、うまく動きません。どうすればいいのかどなたか教えてください。 プログラムは長いので、以下に置きました。 http://aaaaaaassss.seesaa.net/article/80994357.html プログラムはまだ作成途中で、まず、スレッドがきちんと動くようにしたいです。よろしくお願いします。 <html> <body> <applet code=SatelliteOrbitt.class width=1000 height=670> </applet> </body> </html> 使用した画像です。 http://aaaaaaassss.seesaa.net/image/worldmap2.GIF

  • Java
  • 回答数5
  • ありがとう数5

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

  • ベストアンサー
  • _ranco_
  • ベストアンサー率58% (126/214)
回答No.5

アニメスレッドの作り方と動かし方の例として、以下をダウンロードし、コンパイルし、動かしてみてください: http://homepage1.nifty.com/algafield/SatelliteOrbittSwing3.java 動かし方は、 appletviewer SatelliteOrbittSwing3.java です。または適当なhtmlから動かしてください。

kasegun
質問者

お礼

回答ありがとうございます。 こういう風にプログラミングすれば良かったのですね。 まだ、JAVAに関して知識が足りないみたいなので、勉強しておきます。 色々とありがとうございました。

その他の回答 (4)

  • _ranco_
  • ベストアンサー率58% (126/214)
回答No.4

> KeplerCuクラスのsolveZahyouメソッド内で計算された(Xg,Yg)を > 中心とするときちんと描画されるのですが、同じメソッド内で計算された > (kdo,ido)や(xp,yp)を中心とすると、うまく描画されません。 > (Plotボタンをクリックしても、座標(0,0)の位置から動かない) > solveZahyouメソッドで計算した(xp,yp)を座標の中心にしたいと > 思うのですが、この結果は使えないということでしょうか。それとも他 > に計算が必要なんでしょうか? あなたのスレッドのrun()メソッド内では、paintComponent()が使う描画用パラメータを更新せずに、ただrepaint()を呼んでいるだけですね。これは、根本的な間違いです。アニメスレッドのrun()メソッドは、 (1)描画パラメータの値の更新 (2)repaint() (3)Thread.sleep() の繰り返しです。値を更新してrepaint()するから、動きが実現するのです。現状のあなたのコードのように、なにもせずにrepaint()を呼んでも無意味です。 なお、描画パラメータがほかの現動スレッド上で刻々更新されているのなら、repaint()とsleep()だけでもいいですが、その場合は、それらのパラメータがパネルのpaintComponent()からアクセス可能でなければなりません。そのためには、描画パラメータ用の変数をメインクラスのフィールドにするのがよいでしょう。 SatelliteCanvasクラスのxp, ypと、KeplerクラスのsolveZahyou()メソッドのxp, ypは、全然別物ですよ!(後者は単なるローカル変数)。そのことが、分かりますか?。

  • _ranco_
  • ベストアンサー率58% (126/214)
回答No.3

人工衛星に関する計算についてはまったく無知なので、以下の3点のみお答えします。 (1)drawOval()/fillOval()の引数のx, yは、円や楕円を収める矩形の左上隅の座標です。円の中心の座標から、それらを計算して求めてください。 (2)アニメスレッドをactionPerformedの中でnew()してstart()してください(しかしアニメは、javax.swing.Timerを使うほうが楽です)。単軌道描画なら、そのあと、PlotボタンをsetEnabled(false)して不活性にしてください。 (3)solveZahyou()内の長大な if if if ... は、 if (.....){  ... } else if (.....){  ... } else if (.....){  ... } ... にしてください。現状では、毎回すべてのifを調べてしまいます。

kasegun
質問者

お礼

回答ありがとうございます。 >drawOval()/fillOval()の引数のx, yは、円や楕円を収める矩形の左上隅の座標です。 >円の中心の座標から、それらを計算して求めてください。 KeplerCuクラスのsolveZahyouメソッド内で計算された(Xg,Yg)を中心とす るときちんと描画されるのですが、同じメソッド内で計算された(kdo,ido) や(xp,yp)を中心とすると、うまく描画されません。(Plotボタンをクリッ クしても、座標(0,0)の位置から動かない) solveZahyouメソッドで計算した(xp,yp)を座標の中心にしたいと思うので すが、この結果は使えないということでしょうか。それとも他に計算が必 要なんでしょうか?

  • _ranco_
  • ベストアンサー率58% (126/214)
回答No.2

> 回答ありがとうございます。直して頂いたコードを実行したら、 > 計算で出された数値を中心に円が表示されるようになりました。 最新バージョン(?!)を再ダウンロードしてください: http://homepage1.nifty.com/algafield/SatelliteOrbittSwing.java > 最終的には、plotをクリックすると計算で出された緯度・経度 > 上を円が運動するものを作りたいと思っています。 ではplotのリスナのメソッドから、アニメスレッドをnew()してstart()す ればいいですね。さまざまの色の円が、同時に地球上空を軌道すると、おも しろいでしょう(ただしプログラミングはちょっと面倒)。ただし、逆に 1個に限定するなら、リスナの無効化という処理が必要です。「すでに動 いていたら、なにもせずにリターンする」 > そこで、また質問させていただきたいのですが、paintComponent() > が読んで使う描画パラメータの値を更新してからrepaint()を呼ぶ > とあるのですが、ここは具体的にどのようにしたらいいのでしょうか? 描画パラメータがたとえばint xとyで、更新が++x; ++y;なら、この更新 を書いた直後にrapaint()を呼べば、新たなx/yの値による描画が行われ ます。あなたのプログラムでは、keplerのメソッドを一定順で全部呼ん でから、repaint()を呼ぶことになるのかな? > また、計算で出た緯度・経度をうまく地図の画像に対応させるのに何 > かいい方法はあるでしょうか?結構手こずっているので。 これは、中学校の数学でしょう。画面座標のx,yは大きさが事前に決まって いるし(ただし原点(0,0)は左上隅)、計算値をその範囲内の値に変換する だけです。いちいち計算せずに、最初に配列(またはjava.util.HashMap)で マップ(値の写像関係)を作っておくと、プログラミングは楽ですよ。 実計算値 n < x < m -> 画面座標値 xp 実計算値 p < y < q -> 画面座標値 yp

kasegun
質問者

お礼

度々すみません。結局、座標変換は、下のプログラムのような感じでとり あえずやってみました。しかし、円の中心を(xp,yp)にしたいのですが、 うまく、その座標に円が描画されません。数値は問題ないと思うのです が、どこを直したらいいでしょうか? http://aaaaaaassss.up.seesaa.net/image/SatelliteOrbittSwing.java あと、アニメーションがまだ出来ていないのですが、 >描画パラメータがたとえばint xとyで、更新が++x; ++y;なら、この更新 >を書いた直後にrapaint()を呼べば、新たなx/yの値による描画が行われ >ます。あなたのプログラムでは、keplerのメソッドを一定順で全部呼ん >でから、repaint()を呼ぶことになるのかな? これは、119行目の、 kepler = new KeplerCu(yoso); kepler.Heikin(); kepler.Kepler(x); kepler.linearIter(x0); kepler.solveKepler(); kepler.solveZahyou(); sc.repaint(); の部分で出来ているでしょうか?更新は、現在の時間を変数にしているの で、時間が進むにつれて値が更新されるようにはなっているのですが。 >ではplotのリスナのメソッドから、アニメスレッドをnew()してstart()す >ればいいですね。 これは、actionPerformedメソッド内にスレッドを作るということでしょうか。 ここがちょっとうまくいかないので、どういう感じのプログラムになるの か教えていただきたいのですが。 よろしくお願いします。

  • _ranco_
  • ベストアンサー率58% (126/214)
回答No.1

コードを拝見しましたが、あなたがおやりになりたいのは、アニメーションではなくて、plotがクリックされたときの円の描画ではありませんか?。もしそうなら、Xg等の値をより妥当な値(負でなく、もっと有意に変化する値)にすれば次のコードで可能です。 http://homepage1.nifty.com/algafield/SatelliteOrbittSwing.java アニメをするなら、init()の最後にsc.start();を書いてください。もちろん、run()メソッドの中で、paintComponent()が読んで使う描画パラメータの値を更新してからrepaint()を呼んでください。ただし、Thread.sleep(1)は厳しいので、Thread.sleep(100)ぐらいが適当でしょう。 動画の質はSwingのほうが良いので、JAppletやJPanelを使ってください。アニメーションは、javax.swing.Timerを使うとより簡単に書けます。

kasegun
質問者

お礼

回答ありがとうございます。直して頂いたコードを実行したら、計算で出された数値を中心に円が表示されるようになりました。 最終的には、plotをクリックすると計算で出された緯度・経度上を円が運動するものを作りたいと思っています。 そこで、また質問させていただきたいのですが、paintComponent()が読んで使う描画パラメータの値を更新してからrepaint()を呼ぶとあるのですが、ここは具体的にどのようにしたらいいのでしょうか? また、計算で出た緯度・経度をうまく地図の画像に対応させるのに何かいい方法はあるでしょうか?結構手こずっているので。 よろしければ教えてください。よろしくお願いします。

関連するQ&A

  • Swingのコンパイルは成功するのですが・・・。

    Swingを用いたプログラムをコンパイルして実行(javac Pull.javaとEclipseで)すると普通に動作するのですが <html> <head> <title>title</title> </head> <body> <hr> <applet code = "Pull.class" width=900 height=600> </applet> <hr> </body> </html> とwebブラウザ上で実行しようとすると上手くいきません。 FirefoxとIE,Safariで実行してみたのですが駄目でした。 特にFirefox上で動かしたいのですが <applet code = "Pull.class" width=900 height=600> ではいけないのでしょうか? よろしくお願いします。

  • AppletでPackageを指定した場合のHTML

    Defaultのパッケージで作成したAppletは <applet code="Test1.class" codebase="class1" width="150" height="150"> </applet> で実行できますが、P1のパッケージに作ったクラスの指定の仕方が分かりません。 検索で下記のように指定するようにとあったのですが動きませんでした。 <applet code="P1.Test1.class" codebase="class1" width="150" height="150"> </applet>

    • ベストアンサー
    • Java
  • JAVAアプレットの複数表示は可能ですか?

    表題の通り、HTMLに埋め込んでページにJAVAアプレットを2つ表示させようと思っています。実際、 <applet code="TRY11.class" width="300" height="300"></APPLET> と <applet code="TRY13.class" width="350" height="300"></APPLET> を埋め込んで起動させてみたんですが、最初のTRY11.classのほうは表示されました。けれど2つ目のTRY13.classは左上に×印が現れ、表示されません。 何か記述に間違いがあるんでしょうか? あるいは違う方法でないと動かないとか? ご教授お願いいたします。

  • Appletのrepaint()が動作しません

    import java.applet.*; import java.awt.*; /*<applet code="zxy" width="1000" height="1000"></applet>*/ class Object extends Applet { protected int x; /* オブジェクトのx座標 */ protected int y; /* オブジェクトのy座標 */ protected int width; protected int height; Image buffer; Graphics buffer_g; Dimension d = getSize(); public Object() { x = 0; y = 0; width = 0; height = 0; } } /* 楕円クラス */ class Oval extends Object implements Runnable { public Oval() { width = (int)(Math.random() * 56 + 10); height = (int)(Math.random() * 56 + 10); } public void run() { while( true ){ try{ repaint(); Thread.sleep(50); } catch( Exception e ){} } } public void paint( Graphics g ) { if( buffer_g == null ) buffer_g = buffer.getGraphics(); Dimension d = getSize(); buffer_g.setColor( Color.white ); buffer_g.fillRect( 0, 0, d.width, d.height ); buffer_g.setColor( Color.black ); buffer_g.drawOval( x, y, width, height ); x += (int)(Math.random() * 10); y += (int)(Math.random() * 10); g.drawImage( buffer, 0, 0, this ); } } public class A extends Applet { Image buffer; Graphics buffer_g; Oval ov1 = new Oval(); Thread thOv1 = new Thread( ov1 ); public void start() { thOv1.start(); Dimension d = getSize(); buffer = createImage( d.width, d.height ); } } 上記プログラムを実行しても、paint()の中が実行されずにtryブロックを繰り返すだけになってしまいます。paint()を実行するにはどうすればいいでしょうか?

  • UTF-8 TeraTermPro で javaをするにはどうしたらよいのでしょうか

    javaをつい先日からはじめた超初心者です。(javaに関しては) そこで、プログラムがのっている参考書片手にそのまま写して実行させたのですがエラー??で何もできません。 友人に聞いても、そのまま実行すればできる。しか言いません。 授業でもいづれ必要になってくるのでこのままにしておくわけにはいかないのです・・・ 一応、こんな風になりました↓ import java.awt.*; import java.applet.*; public class WebApplet extends Applet{ public void paint(Graphics g){ String myString; myString="簡単なアプレット"; g.drawString(myString,50,50); } } <HTML> <HEAD>実験</HEAD> <BODY> <APPLET CODE ="WebApplet.class"width="190"height="90"> </APPLET> </BODY> </HTML> で、appletviewer WebApplet.HTMLと実行すると Exception in thread "main" java.lang.InternalError: Can't connect to X11 window server using・・・・・・・ と実行できないのです。 どなたか、教えてください。 個人で調べてみたのですが、さっぱりわかりません!! よろしくお願いします!!

    • ベストアンサー
    • Java
  • 画像を表示させるプログラム

    こんばんわ。 現在、Javaで画像を表示させるアプレットを作っているのですが、画像が表示されません。 書いたソースは以下です。 import java.applet.Applet; import java.awt.*; /* <applet code="Panel.class" width="497" height="600"> </applet> */ public class Panel extends Applet { Image data; public void init() { data = getImage(getDocumentBase(),"2-1.gif"); } public void paint(Graphics g) { g.drawImage(data, 0, 0, data.getWidth(this), data.getHeight(this), this); } } 2-1.gifという画像ファイルを表示させたいと思っています。画像ファイルはソースファイルと同じディレクトリにあります。appletviewerで実行しているのですが画像がさっぱり表示されません。 SDKのバージョンは1.5を使っています。 お手数おかけしますが、ご教授の程よろしくおねがいします。

    • ベストアンサー
    • Java
  • JavaAppletのプログラム添削をお願いします

    初心者です。宜しくお願いします。 JAVA Appletで、クリックするたびに画像が変わるものを作りたいのですが、上手くいきません。 プログラムの添削をお願い致します。 JAVA Appletを利用し、画面をクリックするたびに画像が変わるアプリを作りたいのですが、上手くいきません。 ※コンパイルは通るのですが、実行しても何も表示されません。 [参考URL]http://www.geocities.jp/supermisosan/javastudy/mousechange.html この、画像を変えただけのものを作れればOKです。 以下、今私の書いたプログラム内容です。 書いたと言っても、コピペして部分部分を変えただけですが‥。 【click.java】 import java.applet.*; import javax.swing.*; import java.awt.*; import java.awt.event.*; public class click extends JApplet implements MouseListener { Image siro,kiiro,aka2,img; int x=0; Image image[]=new Image[5]; Graphics g; public void init() { addMouseListener(this); image[0]=getImage(getDocumentBase(),getParameter("siro.gif")); image[1]=getImage(getDocumentBase(),getParameter("kiiro.gif")); image[2]=getImage(getDocumentBase(),getParameter("aka2.gif")); image[3]=getImage(getDocumentBase(),getParameter("aka2.gif")); image[4]=getImage(getDocumentBase(),getParameter("aka2.gif")); setBackground(Color.white); } public void paint(Graphics g) { g.drawImage(image[x],0,0,this); } public void mouseClicked(MouseEvent me) { x++; if(x==5) x=0; repaint(); } public void mouseEntered(MouseEvent me) { } public void mouseExited(MouseEvent me) { } public void mousePressed(MouseEvent me) { } public void mouseReleased(MouseEvent me) { } } 【click.html】 <html> <head> <title>test applet</title> </head> <body> <applet code="click.class" width=500 height=500> </applet> <hr> <a href="click.java"> source file </a> </body> </html> 何が足りないのでしょうか? 勉強不足ですみません、宜しくお願い致します!!

  • アプレットをブラウザで表示できない

    こんにちは 似たような質問がいくつかありましたが 解決していないものもあったので また質問させていただきます。 kibou00さん(02/06/17 00:50)の質問とよく似ているのですが 私の場合実行しようとすると Exception in thread "main" java.lang.NoSuchMethodError: main というエラーが出ます。 手順は 1、コマンドプロンプトを開きます。 2、javac test.javaでコンパイルし、test.classを生成します。 (コンパイラはJava2SDKのバージョン1.4.2_09です。) (このとき、何もメッセージはでませんでした。) 3,java testで実行しようとすると xception in thread "main" java.lang.NoSuchMethodError: main というエラーが出ます。 また以下の内容の test.html を test.class と同じディレクトリに置いてIEで開くとアップレットが表示されない以外(タイトルと本文)。 はちゃんと表示されます <html> <head> <title>タイトル</title> </head> <body> <h3>プログラム<h3> <applet code=test.class width=300 height=210><br> </applet> </body> </html> なぜブラウザではアプレットが表示されないのでしょうか。 ただし、appletviewerを使うとちゃんとアプレットだけは 正しく表示されます。 どなたか教えていただけないでしょうか? 本当に困っています。 私の他にも困っている人がたくさんいるような気がします。 お願いします。

    • ベストアンサー
    • Java
  • JavaアプレットでJavaMailAPIを使用するときのエラーについて

    今Javaアプレットでメールを送信するプログラムを作成しているのですが、アプレットだけをappletviewerで実行するときはうまく起動するのに、htmlに埋め込むとアプレットの読み込みに失敗してしまいます。 htmlでは下のようにJavaApplet.classというクラスファイルを指定しているのですが、駄目でした。このhtmlファイルとclassファイルは同じディレクトリに配置しています。これは何が原因なのでしょうか? 使っているjdkのバージョンはjdk1.4.2.12です。 環境変数の設定はJAVA_HOMEにC:\jdk1.4.2_12、PATHにはC:\jdk1.4.2_12\binとしてあります。 よろしくお願いします。 <html> <head></head> <body> <p align = "center">試作</p> <p align = "left">E-mailの送信</p> <Applet code = "JavaApplet.class" width = 400 height = 300></Applet> </body> </html>

    • ベストアンサー
    • Java
  • 【Java】画像表示が出来ない!

    Java初心者です。 Eclipseを使って、Javaアプレットでjpeg画像を表示させようとしたのですが、上手くいきません。表示したい画像をインポートして、このようなコードを書きました。 import java.applet.Applet; import java.awt.*; /* <applet code="クラス名.class" width="497" height="600"> <param name="img" value="img/test.jpg"> </applet>*/ public class クラス名 extends Applet { Image img; public void init() { img = getImage(getDocumentBase() , getParameter("/test.jpg")); } public void paint(Graphics g) { g.drawImage(img , 0 , 0 , this); } } Javaアプレットで実行しても、アプレットは真っ白なままです。GIF画像でも試してみましたが、同じく失敗でした。他のJavaアプレットのプログラム(図形を表示したり)は成功したので、私のパソコンのJavaは問題ないと思います。回答よろしくお願いします。

    • ベストアンサー
    • Java