多種類の画像を素早く表示

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
daj

多種類の画像を素早く表示

#1

投稿記事 by daj » 11年前

javaです。
以下のプログラムは私が作っているプログラムを簡略化したものです。
簡単に言うと40種の画像(24*32)を4つずつ、計160個表示するものです。(実際作ってるものは順番がばらばらになる、クリック時に動作等があります。)
これを実行すると多種の画像読み込みに時間がかかるのか、すぐに全部を表示できません。
高性能なパソコンならどうか分かりませんが、私のパソコンのスペックはよくないからか、画像を一種ずつ表示している様子がわかります。
私としてはこれは好ましくないので、素早く表示する、まとめて表示するなどの改善が欲しいです。
どうすればこのプログラムを改善できるか教えてください。

このプログラムの画像はdataフォルダに40種、0.gif~39.gifが用意されている事が前提になっています。

コード:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Jpeg extends JPanel{
	Image[] img=new Image[160];
	public static void main(String[] args){
		JFrame frame = new JFrame("Test");
		frame.setSize(640,480);
		frame.add(new Jpeg());
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
		frame.setResizable(false);
	}
	public Jpeg(){
		for(int i=0;i<160;i++)
			img[i]=getToolkit().getImage("data\\"+i%40+".gif");
	}
	public void paintComponent(Graphics g){
		super.paintComponent(g);
		setBackground(Color.GREEN);
		for(int i=0;i<160;i++){
			if(img!=null)
				g.drawImage(img[i],16+(i%20)*24,40+i/20*32,this);
		}
	}
}

dic
記事: 657
登録日時: 13年前
住所: 宮崎県
連絡を取る:

Re: 多種類の画像を素早く表示

#2

投稿記事 by dic » 11年前

ソースコードコンパイルして実行しました
一瞬で表示されました
私のパソコンのスペックは
CPU: Core i5 なんたら
メモリ: 2G
HDD 500GBくらい
エディタ: jcpad
です

daj さんのパソコンのスペックはどれくらいでしょうか?

私はパソコン一台しかないので、ほかの環境はわかりません

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

Re: 多種類の画像を素早く表示

#3

投稿記事 by ISLe » 11年前

Java(SE)はImageObserverという仕組みがあって、それを使うと画像データの読み込みが終わるごとに再描画されます。
これはJavaがネットワークを前提に設計されているためで、読み込みに時間を要する場合に有効です。

まとめて表示したい場合は、画像データをすべて読み込み完了するまで待機する必要があります。
画像データの読み込み完了を監視するには一般的にMediaTrackerを使用します。

コード:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.FontMetrics;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Jpeg extends JPanel{
    Image[] img=new Image[160];
    MediaTracker mt = new MediaTracker(this);
    public static void main(String[] args){
        JFrame frame = new JFrame("Test");
        frame.setSize(640,480);
        frame.add(new Jpeg());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        frame.setResizable(false);
    }
    public Jpeg(){
        for(int i=0;i<160;i++) {
            img[i]=getToolkit().getImage("data\\"+i%40+".gif");
            mt.addImage(img[i], i); // 監視するイメージを登録
        }
        setBackground(Color.GREEN); // [移動]一回設定すれば良し

		// ウィンドウフレームワークに影響しないように
		// 画像読み込み監視はスレッドで行う
		new Thread() {
			public void run() {
				try {
					// 読み込み完了まで待機
					mt.waitForAll();
				} catch (InterruptedException e) {
				}
				mt = null; // フラグ代わり
				repaint(); // 再描画を要求
			}
		}.start();
    }
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        if (mt != null) {
			// 画像の読み込み完了を待機中
			// 画面中央に「読込中」メッセージを描画
			FontMetrics fm = g.getFontMetrics();
			String msg_str = "Now Loading ...";
			int msg_left = (getWidth() - fm.stringWidth(msg_str)) / 2;
			int msg_baseline = getHeight() / 2;
			g.drawString(msg_str, msg_left, msg_baseline);
			return;
		}
        for(int i=0;i<160;i++){
            if(img[i]!=null) // [修正] img→img[i]
                g.drawImage(img[i],16+(i%20)*24,40+i/20*32,null); // [変更]影響ないがとりあえず
        }
    }
}
(追記)
0.gif~39.gifを1枚の画像にまとめてデータサイズを減らしロード時間を短くするという手もあります。

daj

Re: 多種類の画像を素早く表示

#4

投稿記事 by daj » 11年前

>>dicさん
私のパソコンはノートパソコンで
OS WindowsXP
CPU X86-ベース PC
メモリ 2GB
HDD 80GB
エディタ eclipse
です。
買ったの4,5年前だし、もうガタが来てるのかなぁ・・・

>>ISLeさん
これいいですね!参考にさせていただきます!

dic
記事: 657
登録日時: 13年前
住所: 宮崎県
連絡を取る:

Re: 多種類の画像を素早く表示

#5

投稿記事 by dic » 11年前

CPU x86ベースって、Pentinum 4 くらいでしょうかね? Core 2 ?
私もXPで、Eclipse 使っていましたけど、メモリは十分にあったんですが、とても重くて、いまのjcpad というエディタにしました
(いろいろ補助機能はないですけど)
Eclipse で、デバック実行するだけで10秒かかったり、とつらい思い出です

なので、軽いエディタにしてみてはどうでしょうか?

でも、いろいろ要素があるので、特定できませんけど
javaって、かなり前からあるから、XPでもバリバリ動くとおもうのですが、個人の感想です、うのみにしないでください

なんかアドバイスになってない(汗

daj

Re: 多種類の画像を素早く表示

#6

投稿記事 by daj » 11年前

解決を押してたつもりになってました。すいません。
皆さん返信ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る