Top  Column  Desktop Java  Bookmarks  What's New  Contact

SwingSwinging.com

20030412

最近は、ずいぶんと日記サイトがはやっているみたい。イラクの戦争を伝えるのも日記サイトが大きな役目を果たしているっていうしね。ということで、単純にそれに触発されただけなないんだけど再開。まえまえから、ずっと書かないでいたことは、気になってたし。

書いてない間にいろいろな変化はあったりして、古いノートPCが手に入ったので、Linuxなんかを入れてみたりした。Redhatの8.0。なんかうれしいね、手元にUnix系?の環境があるってのは。昔馴染みって感じ。これでWindows以外でも、動作のテストができるようになったわけだ。

何も考えずに、MorePasteを動かしてみると、すぐにいろいろと問題が発生。ファイルのパスをペーストするタブは表示もされない。変換の処理自体も、変換後の文字列がクリップボードに書き込まれない。つまり、何にもペーストされない。おいおい、これじゃぁLessPasteじゃないか。こういうのは徐々に直していくしかないね。

それと変化といえば、J2SEのSDKのバージョンが1.4.1になった。一年前は開発のベースは1.3.1だったからね、大きな変化だ。1.4のベータでスピンボタンを試しに使ったことはあったわけだけど、これを取り入れちゃうかどうか。取り入れちゃうと1.4以降専用になっちゃうし。どれくらいの人が1.4を使ってるのかね。なやみどころだ。

APIドキュメントが作りかけだったり、日付と時間をペーストするタブが途中だったり、で、Linuxでうまく動作しなかったり、なんて、いろいろ問題はあるし、そもそも作りを思い出さないといけないし。どうしたものか。うーん。

20030413

ファイルのパスをペーストするタブが表示されない話。ずっと、Windows上だけで開発をしてきたから、パスの表示の最上位は、ドライブになる。で、File.listRootsメソッドで、ドライブの一覧を取得する、ってことをしてるんだよね。この辺がまずいのかね。

細かな動作確認ができてるわけではないので、まぁ、思いつくのはこんなところ、ということ。Windowsでも、空のドライブを一旦アクセスしちゃうから、アラートのウインドウが出る、なんて問題もあり。

久々に考えてみると、複数のクリップボードを切り替える機能なんかあってもよさそう。これは、マイクロソフトのOfficeなんかについてる機能ね。JXTA使って、ネットワーク機能をつけちゃうとか。やりたいことはいろいろ思いつくけど、時間がないぞ。困ったこまった。

20030420

Redhat上でペーストがうまくいかないのを調べてみた。とりあえずの問題は2つ。パスをペーストするタブが表示されないことと、そもそもペーストの処理自体がうまく動作しない。

前者は、タブの初期化の問題。File.listRootsメソッドは動作を疑ってみたわけだけど、考えてみれば、そこに問題がある可能性は少ない。なんてたって、一番、違いがわかりやすいところだからね、その分、しっかりその差が吸収されているはず。ルートディレクトリをさすだけの、要素1つだけのFile型の配列が帰ってきて終わり。わざわざ、動作を調べるプログラムまで作ってみたけど、ちょっと意味なかった。

ただ、バグっぽいのは発見。JTreeでは複数ルートがある場合は、ダミーのルートにぶら下げて、ダミーを非表示にするようにする。今まではWindowsのことしか考えてなかったから、ダミーを使っていたんだけど、そもそもルートが1つだけのOSだと、ダミーはなくてもいいことになる。でも、とりあえず、ダミーは入れたままにしておこう。そうすれば、処理をOSによって変えずにすむし。

後者のペーストの処理自体は、やっぱりうまく行かない。でも、行くときと行かないときがあるのはわかって、行かない場合は日本語が入ってるとき。まいったね、もうちょい調べてみないと。

Redhatでの動作を調べるってをやらないといけないよなとは思いつつも、なんか気分が乗らない。なので、以前に作ったClipWatcherなんてクラスをイジッてみることにした。Javaでクリップボードをハンドリングする場合、書き込みをするときに、それを実施するオブジェクトを書き込む中身と一緒にオーナーとしてセットする。クリップボードの中身が他のオブジェクトとかアプリに書き換えられると、オーナーのメソッドが呼び出されて、それが通知される。

ちょっと問題なのは、中身が書き換わったのを通知する汎用的なイベントがないってこと。リスナのクラスを登録して、なんてことができない。これができるとすごく助かるんだけどね。まぁ、システムのクリップボードはOSが管理しているわけで、アプリにコールバックするような処理の登録はさせないか。OSからみればJavaのVMも所詮はアプリだし。以前のMacOSだとAppleEventなんかでできそうなんだけど。

ClipWatcherは、単純にタイマーのクラスでスレッドをまわして、クリップボードを定期的に取得するというもの。ActionEventを発生するように作っていて、ActionListenerをaddすれば中身が変わったときにactionPerformedを呼び出すようになってる。前に作ったやつは、クリップボードのチェックとループ処理が分離されてないし、中身もプレーンな文字列しか見ていなかった。クリップボードまわりの処理のおさらいもかねて見直すかな。

Clipboardからデータを取り出すとTransferableインタフェースを実装したオブジェクトが取得できる。このオブジェクトには、あらかじめ書き込みをする側が、データの変換処理をカプセル化したDataFlavorクラスを付属させておく。取り出した側は、用意されたDataFlavorから、自分が扱える型にデータを変換できるDataFlavorを選んで、データを取り出すわけ。書き込む側にDataFlavorを用意する責任があるのは、書き込む側じゃないともともとのデータの形式がわからないからだろうね。

SVGを扱うApacheのBatikとか使おうと思ったら、Transcoder APIなんてのを使って、DataFlavorを作ることになるのかね。なんか地味だし、あんまり作りたい処理じゃない。でも、こういう部分で、他のアプリと一緒に使うときの使い勝手に、差がでてくるんだろうけど。

ここにも悩ましい部分があって、単純にTransferableを実装したオブジェクト自体をequalsしてやっても、同一性の確認はできない。つまり、DataFlavorを適用した結果に対して比較してやらないといけなくて、equalsだと最低限の違う可能性しか検知できない。まぁ、そこを簡略化するために、前の実装ではプレーンなテキストしか調べなかったんだよな。

それに、Java2SDKの1.4になって、変わったこととかないのかね。調べてみないと。1.4.2のベータなんてのも出てるし。どうしたものか。

ちょい回り道して、ClipWatcherの改良の話。ClipBoardの中身が変わったことをどうやってチェックするか、同一性の定義に悩んでる。考えてみればTransferableはインタフェースなんで、それがどんなクラスに実装されてるかわからない。それだけでも単純にオブジェクトとして比較しても意味ないってことだ。DataFlavorを使って変換した後のデータで判断しないと。だけど、どのDataFlavorを適用するか。そもそも、適用できるDataFlavorが違ったら、どうするか。そこに行き着くんだよね。

考えててもしようがないので、単純にClipBoardの中をのぞくプログラムを作ってみた。ボタンを押すと、クリップボードの中身と中身がサポートしてるDataFlavorのMIMEタイプの一覧を表示する。中身はとりあえずstringFlavorとjavaFileListFlavorで取り出しておこう。javaFileListFlavorの場合は、リストに格納されているから、ループでまわして、改行を入れてと。

プログラムを実行してみてわかったこと。結構、いろんなDataFlavorを持ってるのね。プレーンなテキストでも、application/x-java-serialized-objectとapplication/x-java-text-encoding、text/plainなんてMIMEタイプに関連付けられている。一番種類が多いのがtext/plainで、取り出すときに使えるJavaのクラスと文字コードの組み合わせの数だけあったりする。クラスは、Stream系とBuffer系、配列がそれぞれあるし。

なんかそろそろ眠くなってきたし、寝るかな。明日は、ETCを買って、取り付けてもらいに行こう。

いろいろペーストしてみて、DataFlavorを調べてみる。

OSの上だけで普通に使う分には、テキストとファイル、URLくらいのMIMEタイプしか出て来そうにない。Windowsだとスクリーンショットがクリップボードに一旦格納されるから、そういうのも入れるとイメージなんかも出てくる。面白いのは、IEで「ショートカットのコピー」をするとapplication/x-java-urlとか、text/url-listになるんだけど、Mozillaで「Copy Link Location」すると普通のテキストにしかなんない。

Fireworksというお絵かきツールのドローオブジェクトは、image/x-java-imageになる。javaのimageクラスで取り出せるけど、ベクトルのデータは保存されないということね。SVGなんかにしてくれるとスゴイんだけどねぇ。

Redhatでも動作させてみると、これくらいだとちゃんと動く。プレーンなテキストでapplication/x-java-text-encodingのDataFlavorがないのは何でだろ。システムの内部コードがUnicodeのWindowsとEUCのRedhatの違いから来るのかしら。このMIMEタイプのJavaクラスはbinaryの配列だし。GIMPのペイントオブジェクトは読み出せない。多分、例外が発生してるんだと思うけど、catchのところをサボってるからわからないし。Mozillaのリンクは、やっぱりapplication/x-java-serialized-objectとtext/plainにしかなんないや。

関係ないけど、Norton Internet Securityって、ファイウォールの設定に信頼ゾーンの登録機能なんかあったのね。2003にアップグレードして気がついた。2002の時は、そもそもマシンが1台しかなかったのもあるけど、意味がわからなくて。これで、sambaでマウントするのにファイアウォールを止めなくて済むようになったぞ。

おしまい

[This page was updated: 2003-05-04 ]
Copyright © 2001-2003 Takashi KOBAYASHI. All Rights Reserved.
../index.htm ../column_index.htm ../dtj_index.htm under constructions ../whats_new.htm ../mailto.htm