Javaの勉強 3日目

まずは前回のおさらい。↓のコードでウィンドウに画像を読み込んで表示させました。
[java] 
import java.awt.Graphics;
import java.awt.Insets;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Timer;
import java.util.TimerTask;

import javax.imageio.ImageIO;
import javax.swing.JFrame;

public class Chap3Main {

/**
* @param args
*/
public static void main(String[] args) {
// TODO 自動生成されたメソッド・スタブ
new Chap3Main();
}

JFrame mainwindow;
BufferedImage img_back;

// コンストラクタ
public Chap3Main() {
this.mainwindow = new JFrame("初めてのウィンドウ");
this.mainwindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.mainwindow.setVisible(true);
// ウィンドウサイズ設定
Insets in = this.mainwindow.getInsets();
this.mainwindow.setSize(480 + in.left + in.right, 360 + in.top
+ in.bottom);
//画像読み込み
try {
this.img_back = ImageIO.read(this.getClass().getResource("IMG_0338.JPG"));
} catch (IOException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}

//タイマー作成
Timer t=new Timer();
t.schedule(new GameTask(),0, 500);
}

class GameTask extends TimerTask{

@Override
public void run() {
// TODO 自動生成されたメソッド・スタブ
Graphics g= mainwindow.getGraphics();
g.drawImage(img_back, 8, 29, mainwindow);
g.dispose(); //描画終了
}

}
}
[/java]
実行結果はこんな感じ↓

↑MacOSX


↑Windows XP


↑Windows 7


↑Linux (Ubuntu 10.04)

1回書けば、いろんなOSで動作します。
Windows 7と他のOSで画像の座標がずれているのが気になりますが、
今はスルーします。

内容をまとめると、
・JFrameクラスのgetGraphicsメソッドでGraphicsクラスのインスタンスを取得する。
・それを利用してdrawImageメソッドで指定した座標に画像を描画する。
・すべての描画がおわったらdisposeメソッドでGraphicsクラスのインスタンスを廃棄する。
・不要になったインスタンスは時間が経つと自動的に廃棄されるが、Graphicクラスのインスタンスは
 OSの描画リソースを確保しているのでなるべく早く廃棄する必要がある。

[java]
public Graphics getGraphics()
public abstract boolean drawImage(Image img, int x, int y, ImageObserver observer)
public abstract boolean drawImage(Image img, int x, int y, int width, int height, ImagObserver observer)
public abstract boolean drawImage(Image img, int x, int y, Color bgcolor, ImageObserver observer)
public abstract boolean drawImage(Image img, int x, int y, int width, int height, Color bgcolor, ImageObserver observer)
public abstract boolean drawImage(Image img, int dx1, int dy1, int dx2, int dy2 int sx1, int sy1, int sx2, int sy2 ImageObserver observer)
public abstract boolean drawImage(Image img, int dx1, int dy1, int dx2, int dy2 int sx1, int sy1, int sx2, int sy2 Color bgcolor, ImageObserver observer)
public abstract void dispose()
[/java]

drawImageメソッドについて

drawImageメソッドは6種類もある。
引数xとyは画像を描画する座標。
widhtとheightは描画領域のサイズを表す。そこに納まるように画像が拡大/縮小される。
bgColorは半透明の画像を描画する際の背景色を指定する。
dx1、dy1、dx2、dy2とsx1、sy1、sx2、sy2は
sx1〜sy2で表示される画像の一部領域を、dx1〜dy2で示される範囲に描画するときに使う。
画像の一部を切り抜いて描画することが可能。
最後のImageObserverには描画対象のウィンドウのインスタンスを指定。
ただし、これはnullを指定していても問題ない。
※ImageObserverはJavaアプレットなどでダウンロード途中の画像データが描画された状況を想定して
用意されたしくみ。画像全体のダウンロードと描画が完了すると、ImageObserverに指定したウィンドウに
通知される。ダウンロードにそれほど時間がかからない状況なら気にする必要はない。

インターネットに公開

次に、前回作成したウィンドウ表示のプログラムをWebサーバ上で実行できるようにしてみたいと思います。
作成したプログラムをインターネットで公開するために、2つのことを行います。

1.プログラムを1つのJARファイルにまとめる
 JARとはJavaARchiveのこと。
 コンパイル後のクラスファイルやリソースファイルを1ファイルにまとめたもの。
 ファイルが1つなのでアップロードも簡単だし、ZIP形式で圧縮されているため、ファイルサイズも小さくなる。
 JARファイルの作成方法はこちらのサイトを参考にしました。

2.Java Web Startを利用するためのJNLPファイルを作成する。
 Java Web Startを利用するとJARにまとめたプログラムのダウンロード・インストール・実行を一気に行える。
 利用するにはJNLPファイルをテキストエディタで作成し、JARファイルと一緒にアップロードする。
 実行するプログラムはJavaアプリケーションそのものなので、基本的にはJavaのすべての機能が使える。
 しかし、Webから簡単に実行できるという性質上、何でもできてしまうと危険過ぎるため、
 サンドボックスというセキュリティ機能によって動作が制限されている。
 JNLPファイルの作成はこちらのサイトを参考にしました。

サンドボックスの機能制限
・ローカルディスク(手元にあるパソコンのハードディスク)にアクセスできない。
・すべてのJARファイルを同一ホスト(1つのWebサーバ)からダウンロードする必要がある。
・JARファイルのダウンロード元のサーバとしか通信できない。
・セキュリティマネージャ(Javaのセキュリティ設定を変更するクラス)はインストールできない。
・ネイティブライブラリ(パソコンにインストールされているライブラリ)は使用できない。
・システムプロパティ(パソコンの環境設定)へのアクセスが制限される。
 これらの制限を解除することも可能だが、その場合は作成者の身元を証明するデジタルコード署名を取得し、
 ユーザの許可を得る必要がある。

マニフェストファイルの作成
 通常のJARファイルはEclipseのエクスポート機能だけで作成できるが、
 JLayerのような外部ライブラリを使用している場合は、
 その場所と名前を記述したマニフェストファイルを作る必要がある。
 マニフェストファイルは「.mf」という拡張子が付いたテキストファイルである。
[java]
Manifest-Version:1.0
Main-Class:Chap3Main
Class-Path:aaa.jar
[/java]

Manifest-Version
 マニフェストファイルのバージョンを記述
Main-Class
 エントリポイントのmainメソッドを持つクラス名を指定する。
Class-Path
 外部ライブラリを使用している場合は、ここにJARファイルの名前を書く。
 複数使用している場合は半角スペースで区切って「Class-Path;aaa.jar bbb.jar」と並べる
 フォルダ内にまとめている場合は「Class-Path: フォルダ名/aaa.jar」のように書く。

それらをサーバにアップロードします。(アップロード時はパーミッションに注意を。)
サーバ側でMIMEタイプの設定をします。Apacheの場合はmime.typesに追記する。
[java]
application/x-java-jnlp-file jnlp
[/java]
MIMEタイプの設定が完了したらwebデーモンを再起動して準備完了!
↓をクリックして下さい。

どうですか?うまく起動しましたか?
これは病みつきになりそうです。
それではまた!

カテゴリー Java