«« JavaアプレットとJavaアプリケーション、2本同時でいきます!(Java連続集中ネタその1) | あのキャラクターコードがすぐにわかる!キャラクターコード一覧ビューアー on Java »»
<< 前回、JavaアプレットとJavaアプリケーション両対応しているコードを書く為のメリットを書きました。
で、>> マイコミジャーナルにてテキストを表示するだけですが、両対応コードを書く為のいいサンプルコードがありましたので、練習作としてコレを参考にまずは画像を表示したりマウスイベントに反応するプログラムを書いてみる事にしました。
↓具体的に動かしてみたのが、下のアプレットです。
>> ソースコード付きお持ち帰り用(090213.zip)はこちら
上記の内容をjavaコマンドから起動させると、MacOSXの場合でしたらコードを修正する事なく下図のようにWindowで起動できます。
ちょっといじっているところがあって無駄な部分もありますが、ダウンロードが嫌な人の為にソースコードも晒してみますね。
※JDK1.5でコンパイルできました。特別な命令は使っていないと思うのでもう少し低いバージョンでもいけるかもしれません。
/*
*
* アプリケーション・アプレット両対応javaソフト開発例
* 画像表示プログラム(Frametest.java)
*
*/
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.Graphics.*;
import java.awt.image.*;
import java.net.URL;
/*
<applet code="Frametest.class" width=200 height=100>
</applet>
*/
public class Frametest extends Applet {
private static final long serialVersionUID = (long) 0.100;
Sprite pi = new Sprite();
/*
* アプレット関連処理
*/
public void init() {
setBackground(new Color( 1.0F, 1.0F, 1.0F));
}
/*
* アプリケーション処理
*/
public static void main(String[] args) {
Frame f = new Frame("test.");
Applet a = new Frametest();
f.setSize(200, 100);
f.add(a);
Image icon = Toolkit.getDefaultToolkit().getImage("TestAppletAndApplication090131.jpg");
f.setIconImage(icon);
f.setVisible(true);
f.addWindowListener(new ExitListener());
}
/*
* 描画部分
*/
public void paint(Graphics gc) {
enableEvents(AWTEvent.MOUSE_EVENT_MASK);
gc.drawString("Hello, world!", 10, 16);
gc.drawRect( 0, 0, 200, 100 );
pi.image2DMasterData = pi.LoadFile("TestAppletAndApplication090131.jpg");
gc.drawImage(pi.image2DMasterData, pi.intX, pi.intY, this);
}
//
// キー入力
public void processMouseEvent(MouseEvent e) {
if(e.getID() == MouseEvent.MOUSE_PRESSED) {
pi.intX = e.getX();
pi.intY = e.getY();
repaint();
}
}
}
/*
* フレーム用イベント処理
*/
//
// 終了処理
class ExitListener extends WindowAdapter {
public void windowClosing(WindowEvent e){
System.exit(0);
}
}
/*
* スプライト試作
*/
class Sprite extends Applet {
public Image image2DMasterData; // 画像データ
static int intX; // x座標
static int intY; // y座標
// 初期化
public Sprite() {
intX = 100;
intY = 50;
}
// 画像のロード
public Image LoadFile(String Filename) {
Image pi;
try {
pi = getImage(getClass().getResource(Filename));
} catch(NullPointerException e) {
pi = Toolkit.getDefaultToolkit().getImage(getClass().getResource(Filename));
// 外部クラスからのgetImageは、ブラウザからのアクセスのみNullPointerExceptionが発生するケースがあるので補正が必要
}
return pi;
}
}
アプレット・アプリケーション共用プログラムのポイントとしましては、
1.メインルーチンを記述しているファイル名クラスについてAppletを継承(extends)する事
2.アプリケーションとして実行する際に起動されるmain()関数内において、Appletフィールドを配置させる事
3.描写部分は、アプレット・アプリケーション共通でpaint()関数内で記述していくこと
というところのようです。
ちょっと共用プログラムとは離れた点ですが、悩んだところといえば // 画像のロード の部分。
ここからゲームのスプライト処理ができるようにしようと、「getImage」関数をmain()クラスから外して独自作成のSpriteクラスに置いてみたら動かなくて時間を食いました。
こういう時もあろうか買っておいた、カンニング本こと「Javaゲームプログラミング 第2版 アルゴリズムとフレームワーク [NEXT CREATOR] Javaゲームプログラミング 第2版 アルゴリズムとフレームワーク」を参考にToolkit.getDefaultToolkit().getImage〜と記述する事で解決できたのですが、理由がよくわかりません。
まずはJavaアプレットとアプリケーションの同時ソースで作成する方法について、とっかかりがわからない人がいらっしゃいましたら参考にしてください。
Java Web Startならば、もっと楽に提供できる?!
と、ここまで書くまでに色々調べていて気がついたのですが(Javaは10年ぶりぐらいに勉強しなおしているので、最近の流れにはホントうといのです)、「今はアプレットよりJava Web Startだぜ!」という流れがあるらしいですね。
Javaの悩みと言えば、バージョンがいくつも分かれているので、新しい技術でプログラムを作った場合、古いバージョンのままでいる人をどうするか?という話があります。
しかし、Java Web Startでは自動的にバージョンアップさせるので自由に作れるのが楽でいいですね。
また、起動がメディアプレーヤーなどのように起動するので、インストーラーとかもなしでいけるのも面白いかも。
ですが、メディアプレーヤーはクリックしたら何も聞かれずにコンテンツをロード&実行してくれますが、Java Web Startの場合は、ブラウザから「ダウンロードしますか?」とダウンロード前にブラウザから聞かれます。
その時点でお客さんが引いてしまわないか、抵抗を取り除くサイト作りが大変かなと思ったり。
アプレットかWeb Startかどっちを覚えていくべきか・・・。
携帯電話における最近のJavaアプリケーション動向
携帯電話OSこと、Androidのプログラミングについても色々調べていたのですが、PC向けデスクトップアプリケーションと興味深い共通性に気がつきました。
日本における大半の携帯電話において、大体のダウンロードして実行するソフトは、JavaアプリケーションかFlash Liteなんですが(auはそれに加えてC++のBREW)、携帯電話のJavaは曲者。
まず、OSがPC向けはJava Standard Edition、携帯向けはJava Minimum Editionということで異なる。
さ らにNTT(iアプリ)の場合はDoJa+CLDC、Softbank(S!アプリ)はMIDP 2.0+CLDC+ソフトバンクオプションAPI、au(オープンアプリ)はMIDP 2.0+CLDCといった具合の組み合わせで、それぞれグラフィック周りなどを中心に互換性が薄いようです。
>> 参考: 第5回 オープンアプリ(Java)への移植 - アプリ★ゲット
iアプリなどからオープンアプリに移植する場合の注意点が書いてあります。
ということは、PCで作った簡単なJavaアプレット/アプリケーションソフトを携帯に移植しよう!と思っても、かなり骨が折れそう・・・。
ですが、Androidの場合は、そもそもJava部分にはJava Standard Editionが採用されているので、PC向けソフトとAndroid向けでかなり共通のコードでソフト開発ができるのかも。
>> Google Android用携帯アプリ作成のための基礎知識 - @IT を読んでみますと、最初からいきなり良く分からない自動生成のファイル(apptツール)があったり、XMLでレイアウトしたりと、PCとはやっぱり違う癖のある部分もあるようですが、研究の価値はあるかも。
最後に今はまだ公式にはされていません?が、次回Java 7に搭載されるらしいJavaFXでしたら、PC・Web上での実行・携帯電話(Android)との垣根が取り払われそうな話も@ITの記事でありましたから、そのあたりも興味深いですね。
余談
全くの余談ですがSun認定Javaプログラマ資格をゲットすべく、SJC-Pの勉強をしているんですがね。
ここで一言。
実践のコードを組みてー!
この手の資格試験の問題集を解いていますと、重箱の隅をつくストレスの溜まる問題が多く
「お前らこんなコード実際には書かないだろ!」
「っていうかチームでコードを読みあう時のこと考えてる?」
「こんな混乱するコードなんか書くんじゃねぇ!」
と間違えるたびに内心愚痴る今日この頃。
Javaの基礎知識をそれなり満遍なく得る動機付けに、資格取得を通じて勉強しているのですけれど、大事なのはこれらを踏まえて何が作れるか。
転職活動の際に手ぶらで行きたくないなと考えていることもあり、ストレス発散も兼ねて、資格試験勉強と平行してJava上で動く何かをぼちぼち作っています。
何かもうちょいましなものを作りましたら公開しますので、お楽しみに。
■参考
・ PC、Web、モバイルで共通RIA環境を実現ーJava FX Mobileの提供を開始、サン・マイクロシステムズ(@IT)
・サン・マイクロシステムズ、JavaFX Mobileの出荷を開始(CNET Japan)
投稿者 kuze : 2009年2月12日 15:50
«« JavaアプレットとJavaアプリケーション、2本同時でいきます!(Java連続集中ネタその1) | あのキャラクターコードがすぐにわかる!キャラクターコード一覧ビューアー on Java »»
コメント