Applet上で描画処理をしたり、キー入力を行うライブラリを勉強がてら作ろうと思ったのですが、Frame・Appletの初期化部分を書こうとしたときやキーの割り込み等を行うため、ライブラリ呼び出し元の情報を取得しようとしたのですが、記述の仕方がどうもよくわかりません。
↓下記のようなソースを、ライブラリ上へ移行させたいのです。
public static void main(String[] args) {
Frame f = new Frame("test.");
Applet a = new Frametest();
f.setSize(200, 100);
f.add(a);
f.setVisible(true);
f.addWindowListener(new ExitListener());
}
いくつかソース付きゲーム向けのライブラリを試しにダウンロードしたのですが、完成しすぎていてどこが何の処理をしているのか今の所ソースを読んでも理解できませんでした。
よろしくお願いします。
だから、アプレットではmainになにをかいても実行されないんだって、回答者1は言ってる。
実際そうです。
hijk05さんありがとうございます。
では、最初の質問にinit()などの記述を付け加えたものの例を↓下記とします。
※元のソースのFrametest部分は、hatena1238220283に直しました。
※a.init();行も追加しました
<始まり 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);
}
}
<終わり>
↑上記のプログラムを javac から実行すると水色の背景に「Hello, world!」と書かれたウィンドウが表示されます。
で、本題ですが、次回以降製作する際にmain部分やinit()部分・windowClosingなどは、毎回同じ処理になると思うので、外部化してimportで呼び出す自作ライブラリとしてまとめたいのです。
例えば、上記のプログラムにおける hatena1238220283クラスの中身は
public class hatena1238220283 extends Applet{
public static void main(String[] args) {
Syokika = new Syokika("<Windowタイトル名>", <Window横幅>, <Window縦幅>);
}
public void paint(Graphics gc) {
gc.drawString("Hello, world!", 10, 16);
}
}
ぐらいにまで省略できるようにしたいのです。
ですが、自分でこのライブラリを作ってみた際には、Applet a = new hatena1238220283(); のhatena1238220283()部分には何を記載すればいいのか?
その関係でか、無理やりコンパイルできるように直した物の、表示がおかしかったり終了イベントが正常に働かなかったりして、上手くいかないので相談させていただきました。
宜しくお願いします。
> 次回以降製作する際にmain部分やinit()部分・windowClosingなどは、毎回同じ処理になると思うので、外部化してimportで呼び出す自作ライブラリとしてまとめたいのです。
というのが質問者さんの本当に行いたいことであれば、まず、Applet を継承したクラス(例えば AppletBase.java とか)を作って、そこに、「毎回同じ処理」になる部分を書きます。AppletBase.java は任意のパッケージにおいておきます。
そして AppletBase.java と機能的に差分になるクラス(Sample.java)を作ります。Sample.java は AppletBase.java を拡張したクラスとします。Sample.java は AppletBase.java の属するパッケージである必要はありません。
このようにしておけば、Sample.java が Applet のクラスであることには違いないので、Applet として動作します。
尚、Applet は main メソッドから起動しませんが、Applet に main メソッドが存在してはいけないという制限はないので、スタンドアローンアプリケーション/Applet の何れでも動作させることは可能です。
というわけで、リフレクションを使う必要はないと思うのですがどうでしょうか?
tsukasa57さんありがとうございます。
ただ、上手く組めないものでクレクレで恐縮ですが、具体的なソース例を頂けないでしょうか?
よろしくお願いします。
uehajさんありがとうございます。
わかりにくくてお手数をおかけしています。
質問の文字数制限にひっかかるかもしれないと思ったので、ソースコードから、init()とかpaint()とかExitListenerクラス(終了処理)といった記述は省略しています。
で、FrameとかAppletやaddWindowListenerなどといった記載を、上記のソースではmain()メソッド内にて行っていますが、これを自分で作成するライブラリ内へ記載します。
そうすることで、main()から自作ライブラリを呼び出すだけで、その辺りの処理(あと+キー入力イベントも)をまとめてこなすようなものを作成したいと考えていますがどう組めば良いのでしょうか?。
よろしくお願いします。