Java Applet 作成秘話
最終更新日:

ブラウザを終了する時にエラーが出る - その1
ブラウザ
Netscape Navigator 3.01Gold[Ja]
現象
Runnable な Applet を実行中にブラウザを終了すると エラーダイアログが一瞬表示され、Applet のウィンドウが画面左上の隅に残る。
詳細
アプレットをデバッグ時に、ブラウザを終了すると時々エラーがでることがあった。
エラーメッセージが一瞬しか見えないので不思議に思っていると、 ある日、アプレットの run() メソッドで Thread.sleep() の InterruptedException を 無視していることに気がついた。
そこで、『もしや』と思い InterruptedException 検出時 while ループを 抜けるようにしたら、この現象は激減した。
独り言
いやー、 Applet が終了しないんじゃしょうがないって事ね。(^^;

ブラウザを終了する時にエラーが出る - その2
ブラウザ
Netscape Navigator 3.01Gold[Ja]
現象
Runnable な Applet を実行中にブラウザを終了すると エラーダイアログが一瞬表示され、Applet のウィンドウが画面左上の隅に残る。
詳細
でも、やはり、時々この現象は出る。
前の教訓を生かし、update() や paint() メソッド内で重い処理を実行することを止め、 run() メソッドで行ってみた
今ではほとんどこの現象は出ない。
独り言
イベントが溜まっていると、実質的に終了しないに等しい場合があるのかも。 shyncronized 文の使い方も気を付けなくっちゃf(^^;

画像がでない!
ブラウザ
Netscape Navigator 3.01Gold[Ja]
Netscape Communicator 4.01a
Microsoft Internet Explorer 3.02Ja
Microsoft Internet Explorer 4.0 Platform Preview1
現象
JPEG などの画像を使用したなんの変哲もない Applet なのにエラーになる。
詳細
MediaTracker や RGBfilter を使用した Applet で、 IE で出るのに Netscape で出ないとか、 Netscape、 appletviewer で出るのに IE で出ない、等の現象に出くわす。
この現象の共通事項は Microsoft Visual J++ で作成・コンパイルしたものは IE で実行できる(あたりまえか)。 これを Netscape で実行すると Null Pointer Exception になる。
逆に、同じソースを JDK1.1.2 でコンパイルすると appletviewer(あたりまえか)、Netscape では実行できるが、 IE では Illeagal Argument になる。
これらの中で一つわかったことは、 Netscape で「resolve IP address...」が出て表示できない場合は、 イメージなどを Java から取り寄せる場合に Firewall 環境だと URL の サーバ名の名称解決するために DNS に問合わせできずにエラーになる。 対応方法としては、当然サーバ名から IP アドレスにすれば良いのだが...
独り言
一体どうしたらいいんだ。ってことで目下調査中。
Microsoft の Java は日本語対応やセキュリティ破りの機能(レジストリやOCXなど) 追加をしているので、肝心な I/F も変えてしまった結果かも。
その証拠?に、コンパイル結果のクラスサイズが違う。
Netscape で DNS が引けない問題って 「DNS が Applet の配置したサイトでないからセキュリティにひっかかった」 なんてことじゃないよね?

java.awt.Rectangle クラスがない!
ブラウザ
Netscape Navigator 3.01Gold[Ja]
Netscape Communicator 4.01a(時々)
現象
Applet を実行すると java.lang.NoSuchMethodError:java.awt.Rectangle になる。
詳細
appletviewer や IE3.02Ja ではちゃんと実行するのに、 Netscape のブラウザでは Rectangle や Point クラスの生成(new)に失敗する。
そこで、実行する Applet で、今までに Rectangle や Point を使っていないものが あるかどうか調べてみたら... あった。問題なく動いている。 Netscape でこれらのクラスを廃止した訳ではなかった。
何故、特定のクラスだけこの状況になるのか不思議だ。
色々調べてみたら Rectangle(Rectangle) や Point() を使っていた。 Rectangle() はあるのに Point() は無いし、 Rectangle(Rectangle) ばかりか Point(Point) もない。
独り言
Java1.1 の API リファレンスで Java1.0 のアプレットをコーディングしようと したのが大きな間違いらしい。 f(^^;
Java1.0 の API リファレンスを復活させなくっちゃ。

Applet が動かない
ブラウザ
Microsoft Internet Explorer3.02Ja
現象
今まで動いていたアプレットが何も変更していないのに、 ある日「...××.class を開いています」と言ったきり反応しなくなる。
詳細
今までファイルのドラッグ&ドロップでも Personal Web Server 経由でも 動いていたアプレットが、ある日突然 Personal Web Server 経由で 「Java クラス http://.../××.class を開いています」と言ったきり ウンともスンとも...
デフォルトのブラウザは現在 Netscape Communicator 4.04 なので、 いつから動かなくなったのかは不明。
考えられる理由は
  1. MSIE3.02Ja with authenticode にしたから。
  2. とうとうプロパイダと契約してネットワークコンピュータの設定をいじったから。
  3. 自分でも知らないうちに「MSIE ならまともに動かないようにする」ロジックをいれたから。
色々と試してみたら回答は 2. だった。 つまり、MSIE は Java クラスファイルのローディング時にサーバ名の解決を 忘れてしまうことがあるらしく、 新しく設定した繋がっていない DNS に問合わせに 行っているためらしい。
独り言
私の環境は Etherボードもないのに Personal Web Server でネットワーク環境 を構築するために、127.0.0.1 の localhost アドレスにコンピュータ名を 付けて、この名称でアクセスしていた(当然 hosts ファイルに定義している)。 でも、 hosts ファイルの確認せずに DNS に問合わせるなんて卑怯だ! (^^;
そう言えば、 Personal Web Server のインストール時でもコンピュータ名の 設定が大文字になってしまって色々と苦労させられた...

やっぱり文字の描画はダメか ?!
ブラウザ
Netscape Communicator 4.04
現象
やっと文字情報が直ったと思ったのに、日本語英数混在文字を描画すると変。
詳細
今まで Java アプレットで日本語の描画も満足にできなかったが、 ようやく Netscape Communicator 4.04 で修正されたと思ったが やはり変だった。
文字を描画するためには使用するフォントの Ascent, Descent 情報を基に 描画位置とサイズを計算するが、得られる情報と実際の描画がどうやら異なるようで、 日本語と英数が混在させた文字列を Graphics.drawString で描画すると Baseline が一致していないことに気が付く。
例えば Serif, plain, 24pixel のフォントを取得( Windowsです )して、 そのメトリックス情報を見ると以下のようになる。
プロパティ備考
Ascent26 要求したサイズと違うようなf(^^;
Descent7
しかも、漢字のベースラインがヘン。 (つまり、漢字は Descent 分だけ下に描画されるので 上の方に広いスペースが空く)
Sample
独り言
フォントやグリフは機種依存だから Java職人が丁寧に一字づつ描画しても 他のプラットフォームでも正常に見えるとは限らない m(..)m
Netscape Navigator 3.01 や Internet Explorer 3.02/4.01 は 未だに駄目だからこれでもいい方なのだが
X Window システムの時も似たような問題にぶつかった記憶が... 誰か対応方法を知っている方教えて下さい。


戻る (C)Copyright 1997 ShinSoft.
All rights reserved.