質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

3回答

4097閲覧

java 画像の表示

satanosaka18419

総合スコア37

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2015/09/01 09:12

コード import java.applet.Applet; import java.awt.*; public class sample extends Applet{ public void paint (Graphics g){ Image img1 = getImage(getDocumentBase(), "image1.jpg"); Image img2 = getImage(getDocumentBase(), "image2.jpg"); for(int i = 0; i < 2; i++){ g.drawImage(img1, 0, 20, this); sleep(20000); g.drawImage(img2, 0, 20, this); sleep(20000); } } public void sleep(int count){ for(int i = 0; i < count; i++){ for(int j = 0; j < 100000; j++){ int h = i * j; } } } }

画像表示のサンプルコードで上記のようなものがあったのですが、これはimage1とimage2を時間をあけて交互に表示するというものです。

このプログラムで動くことは動くのですが、for文で繰り返しを2回にしているのに3回動いてしまいます。
その原因がわかる方がおられましたら教えていただきたいです。

またpublic void sleep(int count)メソッドで何をしているのかよくわからないのですが、これは20000×100000回もの計算をすることで時間をあけているという解釈であっていますでしょうか?

よろしくお願いします!

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

swordone

2015/09/01 09:39

このサンプルコードはどこにあったものですか?
satanosaka18419

2015/09/07 08:50

返事が遅くなってしまいすみません。 「例題で学ぶJavaアプレット入門」という本のP79に載っていました!
guest

回答3

0

ベストアンサー

正直に言ってしまうと、あまり良い例ではないですね。

スリープはビジーウェイト(空回りさせるウェイト)でなくThread.sleepを使うほうが良いです。
それと、Javaではpaintなどの描画メソッドの中ではウェイト(スリープ)を行うべきではありません。
もし他の描画する要素を追加することになると、サンプルコードのような書き方では破綻してしまいます。

下記のように、描画メソッドの外側でバックグラウンドのスレッドを実行して、そこでウェイトと再描画を繰り返すようにしてください。

lang

1import java.applet.Applet; 2import java.awt.*; 3 4public class sample extends Applet extends Applet { 5 6 boolean usesImage2 = false; 7 8 @Override 9 public void init() { 10 super.init(); 11 Thread thread = new Thread() { 12 @Override 13 public void run() { 14 repaint(); 15 for (int i = 0; i < 4; i++) { 16 usesImage2 = !usesImage2; // 反転 17 try { 18 sleep(1000L); 19 } catch (InterruptedException e) { 20 e.printStackTrace(); 21 } 22 repaint(); 23 } 24 } 25 }; 26 thread.start(); 27 } 28 29 public void paint(Graphics g) { 30 String imgName; 31 if (usesImage2) { 32 imgName = "image2.jpg"; 33 } 34 else { 35 imgName = "image1.jpg"; 36 } 37 Image img = getImage(getDocumentBase(), imgName); 38 g.drawImage(img, 0, 20, this); 39 } 40 41}

ご質問とは関係ありませんが、JavaでGUIを練習したいのでしたら、AppletよりもSwingの方をお薦めします。アプレットを使いたいのでしたら、JAppletのほうをお薦めします。

参考リンク:
無限ループとrepaintメソッド - スレッドの利用 - Javaアプレット入門

投稿2015/09/01 11:33

argius

総合スコア9388

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

anonymouskawa

2015/09/01 11:57

>AppletよりもSwingの方をお薦めします。アプレットを使いたいのでしたら、JAppletのほうをお薦めします。 Java8から、JavaFXが正式なGUIライブラリになったという話です。 もちろん、Swingを勉強して損はないですが、FXも視野に入れた方が良いと思います。
argius

2015/09/01 12:00

JavaFXはまだサンプルが充実していないので、初心者のかたにはあまりお勧めできないと思っています。 もちろん、将来的にはJavaFXに切り替えていかないといけないんですけど。
satanosaka18419

2015/09/07 08:59

お返事遅くなってすみません。 Thread.sleepでやってみたらできました。 ありがとうございました。 色々ご意見ありがとうございます! Swing、JApplet、JavaFXを一通り見たいと思います。
guest

0

swordoneさんが回答されているので、sleepについてでですが、
おそらく仰るとおり計算する間時間をあけるという処理でしょう。

しかし、実際はintではあまり意味がありません。

Java

1public class Test { 2 3 public static void main(String[] args) { 4 System.out.println("start:" + (new Date())); 5 sleep(3000000000l); 6 System.out.println("end:" + (new Date())); 7 } 8 public static void sleep(long count){ 9 for(long i = 0; i < count; i++){ 10 for(int j = 0; j < 100000; j++){ 11 long h = i * j; 12 } 13 } 14 } 15}

とても乱暴なソースですが、このソースの結果が
start:Tue Sep 01 20:28:09 JST 2015
end:Tue Sep 01 20:28:10 JST 2015
です。
これだけ値を与えても2秒かからないのです。
しかも無駄に処理をしてるので、このロジックはおすすめはしません。

投稿2015/09/01 11:30

anonymouskawa

総合スコア856

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

satanosaka18419

2015/09/07 08:55

お返事遅くなってしまいすみません。 そうなんですね。 他の方法で時間をあけるようにしたいと思います!
guest

0

もしかしてですが,

i = 0
img1表示
img2表示(切り替え1回目)
i = 1
img1表示(切り替え2回目)
img2表示(切り替え3回目)

ということでは?これならループ2回で間違ってないです.

投稿2015/09/01 09:37

swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

satanosaka18419

2015/09/07 08:54

遅くなってしまいすみません。 img1表示 img2表示 img1表示 img2表示 img1表示 img2表示 の3回になってしまうんです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問