≒ Java appletのweb埋め込みの件

すごく苦労しました。出来たのはこれ。 ドメインのトップページにアプレット埋め込むのもどうかなとは思うんだけど、jre拒否られたらもともとただの白背景だし、実害はないかなと。 とりあえず、ものすごくW3C先生には怒られるようになりました。アクセシビリティ無配慮だし、何より嫌いな細かなピクセル指定や%指定をしまくってるので、別環境や仕様変更にすごく弱いはずw

元々の話から書くと、だいぶ前にJavaScriptの学習をしていた時にこれを作って遊んでたんだけど、JSのはマルチスレッド処理が弱い(無い)から、while(true)が出来ないんでマウスが止まるとどうしても止まっちゃう。画面の外にマウスが出ても停止。それがいくら試行錯誤しても直せないんであきらめてほっておいた。webページに埋め込むのは簡単なんですけどね。

で、Javaの勉強をしてマルチスレッド処理をいれて書くとJSでは出来なかったことが簡単に実現したw それにすごく軽いし。

しかし大問題が。webページ埋め込みがえらく難しい。ググっても解決策皆無。タグもobjectとembed両方で試したんだけど、ページの背景として設定することが全然出来ないのです。(余談だけど、objectタグとembedタグどっちが正式採用になるのかややこしいねw HTML5ではembedが優勢みたいなんで今回はembed使ったけど、仕様としてはobjectの方が優れてるとは思う)

例えば参考にしたページ「CSSだけで背景をフルスクリーンYouTubeにする」のように、iFrameでappletを埋めたページを背景にしようとしても最前面に出てきちゃうし。当たり前か。

そこで基本に帰って、divの重ね合わせの基本通りz-indexを各divに設定してみたら一応出来たんだけど、挙動が変。例えば前面にただの色付きdivを設定したらFireFoxだと浸食しちゃうのです。 ま、前のdivが白ならべつに良いかとも思ったんだけど、前のdivにタグ打って文章書こうとするとappletが最前面に出てきてしまう。文字が(タグも含め)一切見えなくなる。良く分からない。

結局前面divにiframeで各パーツを埋めていくとちゃんと前面に出てくるのでそうしました。読み込んでるdivの内容(もちろんタグも)をそのまま貼ると後ろに回っちゃうんだから良く分からない。ヘッダー部分、メイン部分、フッター部分それぞれ別ページから読み込んでます。

Chrome、FireFox、IE9、最新版ならそれぞれちゃんと動きます。もちろんJava活きてる前提です。面白かったのがChromeで、Javaのcodeでコンテキストサイズに合わせてappletサイズを取得するようにしているので、embedタグのサイズ指定を変えればappletサイズも変わるんだけど、色んな環境でみっともなくならないようにすごくでかく指定したら、IE、FFは問題ないんだけどChromeだとJVM立ち上がらず、ただの白いページになっちゃう。そこら辺は各ブラウザのJVMの扱い方が違うとしか分からないです。

…出来たには出来たけど、これじゃ簡単とはとても言い難い。脆弱性が言われてるからJavaアプレットがブラウザ実装について冷遇されてるのが如実に感じられる件でした。ちゃんと実装してくれれば、クライアントサイドスクリプトとしても軽くて良い環境だと思うんだけどなー。マルチスレッド処理ができるのはJSに対してもすごいアドバンテージなのに。上のJSで書いてるページとJavaアプレットのページを負荷とか較べると一目瞭然w

次はこのブログにも埋め込んでみよう。wordpressで各パーツを切り出すなんて気が遠くなるけど。

7/1追記)妥協しました。

ヘッダー埋め込みまでで断念。リキッド指定にしたくて%数値を試行錯誤してこんな風に落ち着きました。狭いとこに押し込めてごめん。でも%指定って廃止されるんだよね?

7/2追記)

ヘッダー埋め込み、適当にやってたらIE、FFではむちゃくちゃになってることが判明。結局iFrameで呼び出す方法に変更。何かが根本的に間違ってるような気がする。

position:absoluteにしてz-index指定で重ね合わせるんだけど、top/left指定がChromeだと%指定でOK、IEではピクセル指定じゃないとダメ。

そしてFFではきっちりappletが最前面に出てきちゃって何も読めず…

その他の問題として、IEだとサイドバーのタグクラウドが挙動不審、つーかただの飾りになっちゃってて、タグ別ページにジャンプ出来ない。これはIEのcanvas実装の問題?で、アプレット関係ないかも知れない。しかしChromeでも時々タグクラウドがフリーズする模様。これはアプレット入れる前は出なかった現象。

そしてFFではタグクラウドは全く問題なく動作してる…

とりあえずFFの重ね合わせ問題は直そう。けどこれってプログラミングでも何でもなくて、HTMLのお絵かきの問題だよなー。…頑張って直そう。

≒ showStatusの挙動不審

先日の問題も解決してないのだけど、また挙動不審追加。

簡単なアニメーション描画のアプレットを作ってJavaのマルチスレッディングの学習を進めてるんだけど、showStatusはchoromeだと意味なしで、FireFoxだとちゃんと左下に描画される。それはいい。

何故かFireFoxでshowStatusを設定すると、アニメーションでごみが残る(=スレッドセーフじゃなくなる?)。

解明すべき宿題がどんどん増えていく…

≒ 続) swing インナークラス

setBackground() はJPanel側では記述はできるけど無効。

JApplet側のinit()内に記述すると機能する。おそらくstart()その他でもOK。

swing(つまりpaintComponent())じゃなければ普通にオーバーライドしてるpaint()に記述して使えるんだけど?