ようこそゲスト さん ユーザー登録 ログイン

Javaアプリケーションの開発において、ウインドウやAppletの初期化部分・割り込み処理などを外部化してimportで取り込める形(=ライブラリ化)にしたいのですが、記述方法が分かりません。例としてシンプルなソースを提供して下さっているサイトをご存知の方はいらっしゃらないでしょうか?(もしくは簡単なサンプルコードを直接教えてください)

http://q.hatena.ne.jp/1238220283 の続きです。

例えば、コメント欄に記述したソースをライブラリ上へ移行させたいのです。
コメント欄のプログラムを javaコマンドから実行すると水色の背景に「Hello, world!」と書かれたウィンドウが表示されます。

で、例えばmain部分を
public static void main(String[] args) {
Syokika = new Syokika("<Windowタイトル名>", <Window横幅>, <Window縦幅>);
}
ぐらいにまで省略できるようなライブラリを記述するにはどうすれば良いのかと考えています。

いくつかソース付きゲーム向けのライブラリを試しにダウンロードしたのですが、完成しすぎていてどこが何の処理をしているのか今の所ソースを読んでも理解できませんでした。
よろしくお願いします。 Javaアプリケーションの開発において、ウインドウやAppletの初期化部分・割り込み処理などを外部化してimportで取り込める形(=ライブラリ化)にしたいのですが、記述方法が.. を含むブックマークはてなブックマーク - Javaアプリケーションの開発において、ウインドウやAppletの初期化部分・割り込み処理などを外部化してimportで取り込める形(=ライブラリ化)にしたいのですが、記述方法が.. - 人力検索はてな

  • halohalolin あなたも質問に答えられます! ウォッチリストに追加
  • 状態:終了 いるか
  • 回答数:2 / 5件
  • 回答ポイント:70ポイント
  • 登録:2009-04-04 04:00:47
  • 終了:2009-04-10 10:21:02
  • カテゴリー:コンピュータコンピュータ ウェブ制作ウェブ制作

1 回答者:tsukasa57 2009-04-04 16:38:12 満足! 35ポイント

質問者さんは Applet でも Application でも動作するように作成したいのですよね?

http://www.asahi-net.or.jp/~dp8t-asm/java/tips/AppletApp.html

が参考になると思います。

質問者:halohalolin 2009-04-05 23:48:00

tsukasa57さんありがとうございます。

今回は、Applicationからのみ動くのでも良いかなと思っていたのですが、リンク先の内容は参考になりそうです。

試してみます。

2 回答者:bufferings 2009-04-06 00:14:06 満足! 35ポイント

色んな方法がありますけど、ここで一番分かりやすいのは

コメントに書いてあるコードのmainを生成用のstaticメソッドにすることですかね。

public class hatena1238220283 extends Applet {

  public static Applet create(String title, int width, int height) {
    Frame f = new Frame(title);
    Applet a = new hatena1238220283();
    f.setSize(width, height);
    a.init();
    f.add(a);
    f.setVisible(true);
    f.addWindowListener(new ExitListener());

    return a;
  }

  public void init() {
    setBackground(new Color(0.8F, 1.0F, 1.0F));
  }

  public void paint(Graphics gc) {
    gc.drawString("Hello, world!", 10, 16);
  }

}

class ExitListener extends WindowAdapter {
  public void windowClosing(WindowEvent e) {
    System.exit(0);
  }
}

で、呼び出し側は

public class Main {
  public static void main(String[] args) {
    String title = "<Windowタイトル名>";
    int width = 400;
    int height = 200;

    Applet myApplet = hatena1238220283.create(title, width, height);
  }
}
質問者:halohalolin 2009-04-06 00:27:12

bufferingsさんありがとうございます。

bufferingsさんの方法そのもので行う場合ですと、別のプログラムでこのライブラリを使う場合にApplet a = new hatena1238220283(); の部分など毎回書き換えが必要な部分が発生しますね。

でも、アレンジすれば色々活用できそうなので試してみます!

おとなり質問

この質問・回答へのコメント

ライブラリ化する前のサンプルコードは以下の通りです。

<始まり hatena123822028.java>
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
public class hatena1238220283 extends Applet{
public static void main(String[] args) {
Frame f = new Frame("test.");
Applet a = new hatena1238220283();
f.setSize(200, 100);
a.init();
f.add(a);
f.setVisible(true);
f.addWindowListener(new ExitListener());
}
public void init() {
setBackground(new Color( 0.8F, 1.0F, 1.0F));
}
public void paint(Graphics gc) {
gc.drawString("Hello, world!", 10, 16);
}
}
class ExitListener extends WindowAdapter {
public void windowClosing(WindowEvent e){
System.exit(0);
}
}
<終わり>

よろしくお願いします。
あら。
質問の意図を理解できていないようです。
見当違いですみません。


僕が勘違いをしていると思うので
もしよかったら
・ライブラリ化したいコード
・ライブラリを使うコード
をどういう感じにしたいのかを
もう一度だけ詳しく教えていただいてもよろしいですか?
コンパイルできない状態で構いません。
bufferingsさん、何度もつきあっていただいてありがとうございます。

ライブラリ化したいコードについてですが、
今Javaアプリケーションとして動作する簡単なゲームを作りたいと
考えています。
で、基礎的な所をしっかり押さえる力をつけていきたいと考えているので
ゲーム向けの画像やキー入力・音声を制御するライブラリも自分なりに
一緒に作っていきたいと考えています。
※で、そこで作ったライブラリは次回以降使い回しができるようにしたいと
考えています。

とはいえ、最初の表示初期化部分で「ライブラリとして」どう書くのか詰まってしまい
試行錯誤している段階です。
初期の問題だけをとりあげてみようと上記コメントのコードをあげてみました。

bufferingsさんのコードの場合、呼び出し元のmain以降は全ての処理を
ライブラリに丸投げして完結されています。
が、ゲームの場合描画部分などはケースバイケースで異なると思うので、
paint()は呼び出し元で制御するように改造する必要があるかなという印象を受けました。

また、ライブラリ自体を毎回使うたびにソースを呼び出し元に合わせて
改造する必要があるのはスマートではないなという印象があるので
この辺りもなんとか自分で考えてみる必要があるなという感想を持ちました。

※コード例をご希望との事でしたが、ちょっとライブラリ&サンプルコードが
まだお見せできる状態になっていないので、お手数ですがちょっと話をそらさせていただきました。

よろしくお願いします。
丁寧に説明してくださってありがとうございます。
なるほど。
http://q.hatena.ne.jp/1238220283#a907075
のtsukasa57さんの回答がそのものって感じですかね。

[ライブラリ側その1]
MyAppletBase.java
アプレットクラスの処理で共通化しておきたいものをここに書いておきます。

public class MyAppletBase extends Applet {
public void init() {
setBackground(new Color(0.8F, 1.0F, 1.0F));
}

public void paint(Graphics gc) {
gc.drawString("Hello, world!", 10, 16);
}
}

[ライブラリ側その2]
MyAppletUtil.java
MyAppletBaseに入れてもよかったんですけど。分けた方が分かりやすいかなと思ったので分けてみました。appletをパラメータで受け取って、それを使います。

public class MyAppletUtil {
public static void showApplet(Applet applet, String title, int width,
int height) {
Frame f = new Frame(title);
f.setSize(width, height);
applet.init();
f.add(applet);
f.setVisible(true);
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}

これで
public static void main(String[] args){
MyAppletUtil.showApplet(new MyAppletBase(), "MyAppletBase", 200, 100);
}
で呼び出せば、HelloWorldが表示されます。

[ライブラリの拡張]
MyApplet2.java

public class MyApplet2 extends MyAppletBase {
public void paint(Graphics gc) {
gc.drawString("Hello, MyApplet2!", 10, 16);
}
}

これで、
public static void main(String[] args) {
MyAppletUtil.showApplet(new MyApplet2(), "MyApplet2", 100, 200);
}
で呼び出せば、HelloMyApplet2が表示されます。


・・・こういうことかなぁと思うのですが。
またはずしてたらすみません。
bufferingsさん何度もつきあっていただいて本当にありがとうございます。
申し訳ない事にまだtsukasa57さんの回答もふくめて自分なりの検証ができていないのですが
大変参考になりそうです。
大感謝!
今更ながら最初の最初で行き詰まっていた自作のライブラリにbufferingsさんやtsukasa57さんの方法を適応してみました所、エラーが全部消えて動き出しました!
だからといってまだ殆ど作り込んでいないので動かないのですが、助かりました。
ありがとうございます!!

この質問・回答へのトラックバックこの質問・回答へのトラックバック