スレッドの使い方がわからず悩んでいます

このQ&Aのポイント
  • javaを勉強していますが、スレッドの使い方がわからず悩んでいます。
  • 作りたいアプレットはクリックするたびに画像が変わるものです。
  • スレッドを使用して、クリックした際に画像を切り替える方法がわかりません。資料も教えていただけると助かります。
回答を見る
  • ベストアンサー

スレッドの使い方が分からない。

javaを勉強しています。その流れの中であるアプレットを作っているのですが、スレッドの使い方がわからず悩んでいます。 作りたいアプレットはイメージ的には下記のページのアプレットをマウスでクリックするごとに次の画像へ変わる。というものを作りたいと思っているのですが、例えば、下記のアプレットでしたらスレッドを一つ作ってwhile文で回す、といった感じでいいと思うのですが、クリックすると次の画像へ変わるというものを作ろうとしたときスレッドはどのように使うべきなのでしょうか? スレッドは1度使うと、2度は使えない、ということを知って、「一つのスレッドで工夫して、クリックされたらスレッドが流れるようにして、画像が完全に変わったらストップ。また、クリックされたら…」とするか、「クリックされるごとにインスタンスを作って、スレッドを流して、終わったら破棄(?)」といったようにするかで悩んでいます。 …ただどちらにしてもコードの書き方がイマイチまだイメージがつかめないのですが…。また、スレッド関係でいい資料(本、URL等)があれば、教えていただけるとそれも嬉しいです。 よろしくお願いします。 http://home.impress.co.jp/magazine/hpmag2/skillup/applet/01/ImageFader10/ImageFader.html

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

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

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

おっとっと、要求の細部がわからないまま回答を書いていると、いろんな妄想が湧きますが、paintComponent()が使うパラメータを経時制御するためにすでに別のスレッドが動いているのなら、myPanel.repaint()はそのスレッドから呼ばれているはずだから、mouseClicked()はimageを変えるだけでよいですね。

nabewari
質問者

お礼

回答ありがとうございます。 おかげさまで解決しました!

その他の回答 (1)

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

投稿の文面を見たかぎりでは、別スレッドは要らないでしょう。あなたの画像パネルがpaintComponent()の中でdrawImage(image, ...)していて、imageがインスタンス変数なら、画像パネルがimplementsしているMouseListenerのmouseClicked()メソッドの中で: image = nextImage(); //自作のメソッド repaint(); でよいのでは?

関連するQ&A

  • アプレットでフェードイン、フェードアウトのエフェクトを実現したい。

    javaを勉強しています。 その過程でアプレットで画像処理をやっているのですが、ある画像を表示した状態から別の画像へフェードアウトしていく(というのでしょうか?フェードアウトとフェードインを同時にやるような感じで、だんだん次の画像へ変っていくという感じです)処理を実現したいのですが、やり方がよく分かりません。 下記のページのアプレットなどを参考にやっていたのですが、下記のページのアプレットはプラスズームインなどのエフェクトも加わっていて、コードを読むのが難しくて、フェードアウトのエフェクトを理解するところまでなかなかいけません…。 参考になるページや本だけでも結構です。 よろしくお願いします。 http://home.impress.co.jp/magazine/hpmag2/skillup/applet/01/03.htm

    • ベストアンサー
    • Java
  • スレッドを動かすには?

    プログラムをアニメーションさせたいのですが、うまく動きません。どうすればいいのかどなたか教えてください。 プログラムは長いので、以下に置きました。 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
  • スレッドについての質問です。

    下記のロジックを見ていただきたいのです。 スレッドがnullの間はrunが動いています。 問題は一番下に記載した"stopplay()"というメソッドだと思われます、スレッドを停止して直ぐにまた動かしていますがどうもスレッドが二つ動いている様子です。なぜでしょうか? ************************************************** //最初にスレッドを開始します。 public init(){ play(); } ************************************************** //スレッドのON OFF public void threadOnOff(boolean sw) { if(sw == true){ thread =new Thread(this); thread.start(); } else { thread = null; } } ************************************************** //スレッド開始 public void play(){ threadOnOff(true); } ************************************************** //スレッド停止 public void stop(){ threadOnOff(false); } ************************************************** //runメソッド  public void run(){ String mode = ""; while(thread != null){ try { thread.sleep(500); //0.5秒間隔で動きます。 mode = modeRequest(); if(mode.startsWith("STOP") == true) { //スレッド停止 threadOnOff(false); } } catch (InterruptedException ie) {} } } ************************************************** //問題のメソッドです。 public void stopplay(){ stop(); play(); }

    • ベストアンサー
    • Java
  • Javaアプレットで複数のスレッド (初心者です)

    javaアプレットで二つのスレッドを作り、それぞれからパラパラアニメ(0.4秒間隔で絵が変わるものanime1と0.7秒のものanime2)を表示させたいと考えています。 パラパラアニメ本体はhttp://www.ipc.hokusei.ac.jp/~z00104/java/anim.htmlをほぼコピーで使わせてもらい、それ単体では動かせました。 しかし二つスレッドを作るためにRunnableを実装したクラスを二つ用意して、それをまた別の一つのクラスから呼び出すことがうまくできません。 public class oshietegoo extends Applet{ anime1 aa = new anime1(); anime2 bb = new anime2(); Thread a = new Thread(aa); Thread b = new Thread(bb); a.start(); b.start(); //(スレッドの作成についてはhttp://www.tohoho-web.com/java/thread.htmを参考にしました) } class anime1 extends Applet implements Runnable{ 【中身は最初のURLのコピー】 } class anime2 extends Applet implements Runnable{ 【中身は最初URLのコピー】 } というように書いているのですが、a.start();とb.start();のところで「トークン "start" に構文エラーがあります。このトークンの後には Identifier を指定する必要があります」とエラーが出てしまいます。 色々と調べたり、インスタンスやクラスなど基本的な概念を勉強したりしたつもりなのですが、なぜエラーが出るのか分かりませんでした……。 どなたか解決法を教えていただけませんでしょうか? 初心者な質問で申し訳ないのですが、お力添えいただけると助かります。 不足があれば追記いたしますので、よろしくお願いいたします。

    • ベストアンサー
    • Java
  • アプレットとボタン

    今現在アプレットについて勉強しているものです。 少し行き詰っているので助けてもらえるとありがたいです。 今アプレットのキャンバスを使い時計と作ろうとしています。 ですがただの時計(スレッドでやるお決まりの時計)は出来るのでGUIのボタンを少しつかってみようと思い、 「ボタンが押されてから時計がスタートする」というものを作ろうとしました。 そこで考えたのが、まずボタンとキャンバスを作っておいて、 ボタンが押されたら、ActionPerformedのメソッド内でスレッドを作成して、 キャンバスの時計を進めるという方法なのですが どうしてもキャンバスのインスタンスを作成した瞬間に、 キャンバスのpaint()が呼ばれて、時計が少し進んでしまいます。 完全にボタンを押した後に、キャンバスが呼ばれ、paint()もそこからスタートするようにするにはどうしたらいいでしょうか? 要するに、Appletのpaintメソッドをボタンが押された後に始めて動くようにしたいのです;;

  • Appletを利用したマルチスレッドプログラミング

    現在JavaのAppletを利用したマルチスレッドのプログラミングを行っているのですが、なかなか思うように行きません。 やりたいのは同じクラスを持つインスタンスをそれぞれスレッドで動かし、それぞれ個別に操作を与えたいのです。 例えばこのサイトのページではボール1、ボール2をそれぞれ作成していますが、もう少し汎用化したいのです。 http://www.mm2d.net/applet-howto/howto-07.shtml 例えばAppletで動かすSampleBallクラスのインスタンスを複数作成し、 それぞれスレッドで動かすにはどうすれば良いでしょうか。 別クラス(ファイル)として作成したいです。 イメージとしてはこのような感じなのですが、Main.javaを起動するとAppletが起動しません。 またそれぞれスレッドで動かすということで、任意にAppletにSampleBallクラスのインスタンスを 追加したり、削除したり、操作したりするにはどうすればよいでしょうか。 ・Main.java static void main(String args[]) {   SampleBall ball1 = new SampleBall(・・・);   SampleBall ball2 = new SampleBall(・・・);   SampleBall ball3 = new SampleBall(・・・);   … } ・SampleBall.java public class SampleBall extends Applet implements Runnable{ public SampleBall(…){ ・・・ }    public void changeColor(Color col){・・・}    … } 参考になるページ等も教えて頂ければ助かります。 どうぞよろしくお願いします

  • Thread.Abortメソッド後の処理について

    Thread.abortメソッドについて分からないことがあったので,助言が頂けると嬉しいです. Thread.Abort () を発生させると,通常そこでスレッドが終了するということなので,その後のスレッド内の処理はスルーされると思っていたのですが,下記コードですとその後の pictureBox1.Image = null;も実行されている様です. mainでスレッド作成→threadAの停止になると考えていたのですが,delegate内では反映されないのでしょうか? Thread thread_a; //スレッド delegate void Del(); private void main(object sender, EventArgs e) { //スレッドを開始 thread_a = new Thread(new ThreadStart(threadA)); thread_a.Start(); } private void threadA() { new Thread(new ThreadStart(delegate { Invoke((Del)delegate { thread_a.Abort(); //画像を消去する pictureBox1.Image = null; }); })).Start(); }

  • 【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
  • デジタル時計を表示するには?

    いつもお世話になりありがとうございます。 標記の件。 エディターはVS codeを使っております。 コードは下記です。 import java.applet.*; // Applet import java.awt.*; // Graphics, Image, Color, MediaTracker import java.util.*; // Calendar, TimeZone public class DigitalClock extends Applet implements Runnable { Thread thread = null; Image Digit[ ] = new Image[11]; // 画像データ(0~9,:) int DigitWidth, DigitHeight; // 画像データの幅と高さ Image WorkImage; // 作業用イメージ Graphics WorkGraphics; // 作業用グラフィックス int AppletWidth, AppletHeight; // アプレットの幅と高さ // 初期化処理 ----------------------------------------------------------------------- public void init( ) { AppletWidth = getSize( ).width; // アプレットの幅と高さ AppletHeight = getSize( ).height; WorkImage = createImage(AppletWidth, AppletHeight); // 作業用イメージ作成 WorkGraphics = WorkImage.getGraphics( ); // 作業用グラフィックス取得 MediaTracker mediatracker = new MediaTracker(this); // メディアトラッカー生成 for(int i = 0; i < 11; i++) { // 画像データを入力 Digit[i] = getImage(getCodeBase( ), "image/" + i + ".gif"); mediatracker.addImage(Digit[i], 1); // メディアトラッカーに入力画像を設定 } try { mediatracker.waitForID(1); // 画像入力が完了するまで待つ } catch (InterruptedException e) { // waitForIDに対する例外処理 showStatus(" "+e); } DigitWidth = Digit[0].getWidth(this); // 画像サイズ DigitHeight = Digit[0].getHeight(this); } // アプレット開始 ------------------------------------------------------------------- public void start( ) { thread = new Thread(this); // スレッド生成 thread.start( ); // スレッドスタート } // 描画処理 ------------------------------------------------------------------------- public void paint(Graphics g) { g.drawImage(WorkImage, 0, 0, this); // 作業イメージをアプレットに描画 } // スレッド実行 --------------------------------------------------------------------- public void run( ) { while (thread != null) { // スレッドが存在している間 DispTime( ); // 時刻描画 repaint( ); // 再描画 try{ thread.sleep(100); // スリープ } catch(InterruptedException e) { // 他のスレッドの割り込み例外処理 showStatus(" "+e); } } } // 描画更新処理再定義 --------------------------------------------------------------- public void update(Graphics g) { // デフォルトのupdateを再定義 paint(g); // 背景色画面クリア削除,paintのみ } // 時間描画 ------------------------------------------------------------------------- void DispTime( ) { // カレンダーオブジェクト作成 Calendar date = Calendar.getInstance(TimeZone.getTimeZone("JST")); int hour = date.get(Calendar.HOUR); // 現在時刻の時間取得 int minute = date.get(Calendar.MINUTE); // 現在時刻の分取得 int second = date.get(Calendar.SECOND); // 現在時刻の秒取得 // 作業グラフィックに描画 WorkGraphics.setColor(Color.white); WorkGraphics.fillRect(0, 0, DigitWidth*8, DigitHeight); int h1 = hour / 10, // 時間の10の桁 h2 = hour % 10; // 時間の1の桁 WorkGraphics.drawImage(Digit[h1], 0, 0, this); WorkGraphics.drawImage(Digit[h2], DigitWidth*1, 0, this); WorkGraphics.drawImage(Digit[10], DigitWidth*2, 0, this); int m1 = minute / 10, // 分の10の桁 m2 = minute % 10; // 分の1の桁 WorkGraphics.drawImage(Digit[m1], DigitWidth*3, 0, this); WorkGraphics.drawImage(Digit[m2], DigitWidth*4, 0, this); WorkGraphics.drawImage(Digit[10], DigitWidth*5, 0, this); int s1 = second / 10, // 秒の10の桁 s2 = second % 10; // 秒の1の桁 WorkGraphics.drawImage(Digit[s1], DigitWidth*6, 0, this); WorkGraphics.drawImage(Digit[s2], DigitWidth*7, 0, this); } // アプレット停止 ------------------------------------------------------------------- public void stop( ) { thread = null; // スレッドを無効 } } ご回答のほど宜しくお願い申し上げます。

    • ベストアンサー
    • Java
  • JAVAの文法について教えてください。

    JAVAを学習しはじめたばかりの初心者です。 下記のプログラムに関してわからないので教えてください。 下記はtest.gif画像を表示するプログラムなのですが、 イメージを表示するために import java.awt.Graphicsをインポートして、 Image im でオブジェクトを宣言するのはわかるのですが、 通常はこの後に im = new Image() のようにインスタンス化する必要があると思うのですが、 このプログラムにはありません。 なぜ不要なのでしょうか? ********************** import java.applet.Applet; import java.awt.Graphics; import java.awt.Image; public class MyImage extends Applet{ Image im; public void init(){ im = getImage( getDocumentBase(), "test/test.gif" ); } public void paint(Graphics g){ g.drawImage( im ,10,10, this); } }

    • ベストアンサー
    • Java

専門家に質問してみよう