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縦幅>);
}
ぐらいにまで省略できるようなライブラリを記述するにはどうすれば良いのかと考えています。

いくつかソース付きゲーム向けのライブラリを試しにダウンロードしたのですが、完成しすぎていてどこが何の処理をしているのか今の所ソースを読んでも理解できませんでした。
よろしくお願いします。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2009/04/10 10:21:02
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:tsukasa57 No.1

回答回数110ベストアンサー獲得回数20

ポイント35pt

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

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

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

id:halohalolin

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

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

試してみます。

2009/04/05 23:48:00

その他の回答1件)

id:tsukasa57 No.1

回答回数110ベストアンサー獲得回数20ここでベストアンサー

ポイント35pt

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

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

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

id:halohalolin

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

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

試してみます。

2009/04/05 23:48:00
id:bufferings No.2

回答回数4ベストアンサー獲得回数1

ポイント35pt

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

コメントに書いてあるコードの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);
  }
}
id:halohalolin

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

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

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

2009/04/06 00:27:12
  • id:halohalolin
    ライブラリ化する前のサンプルコードは以下の通りです。

    <始まり 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);
    }
    }
    <終わり>

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


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

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

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

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

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

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

    よろしくお願いします。
  • id:bufferings
    丁寧に説明してくださってありがとうございます。
    なるほど。
    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が表示されます。


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

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません