Readmeじゃないよ 6

■20011228

師走です。でも、時は2001年です。2年もタイムスリップしてしまった。本当、2年間、何をやっていたんだよ、という感じ。念願のWebサイトを作成して、MorePasteも陽の目を浴びさせることになりました。なんだか、不思議な気分。

一応、動作確認をすると、問題がいろいろと出てくるもんだ。あと、基本構造もマズイ部分が結構ある。この構造で作るのは、今ある機能を全部入れた形で一旦作って、それで終わりかね、という。2年の歳月で成長したどうかは別として、今なら、別の見方ができる、ということさ。JDKの使い方もだいぶ慣れたし。

まず、パスのペースト機能のタブが出ないじゃん。いろいろ見て行くと、そうか、1999年の最後に1.0にするために、機能を落としたんだ。パスのペーストは、機能としては十分に作りこんだんだけど、それだけにプラグイン化の先兵にしようとしちゃったんだよね。とりあえず、プラグイン化はやめにして、入れちゃいましょう。せっかく作ったんだし、プラグインにするなら全体的に作り直してからにするから、だいぶ先になっちゃう。

それと、他の機能については、ちゃんと動作するんだけど、なぜか行の間に、余計な空行が入っちゃう。改行コードが1つ多く挿入してる、ってことなんだけど、なんでだろう。全部が全部、そういう動作をするところを見ると、JDKの差が原因なんだろうか。うーん。これは、細かい動作を見ないとなんとも言えません。

■20020101

あけまして、おめでとうございます。雪の新潟は、今日は雨。山のほうはやっぱり雪なんだろうな。年末に帰ってくるときの高速は吹雪いていて、なんだかすごくストレスフルだったし。

田舎に帰ってまで、空行が入る問題の動作の確認。だって、することないし。それでわかったこと。JDK側の動作は何も変わっていない。変換後の内容確認は、System.outと秀丸、Outlook Expressの新規メール作成のウインドウへのペーストで行っている。System.outは、空行は入らないんだけど、後の二者は空行が入る。なんでだ?

調べていくと、なんと、どちらも改行するとLFのコードしか出現しないことがわかった。いつからWindowsは改行コードがCR+LFじゃなくて、LFだけになったんだよ。Windows2000が、CR+LFを1文字として扱わなくなったから、秀丸は素直にCRとLFでそれぞれ改行動作をしている、という印象。

秀丸で改行コードをタイトルバーに表示するようにすると、"CR+LF"になっている。だけど、"CR"、"LF"だけで改行していて、だから当然、改行が1つ多いような状態になる。それを再度ペーストしなおすと、全部LFになっちゃう。おいおい、なんで、そんな仕様の変更をしたんだよ。うーん。どうしたものか。

Mac OSもX(テン)で、中身はMachをカーネルに使った立派な?Unixになったし、この際、改行コードはLFに統一、ということかね。困った、こまった。

■20020110

Webサイトから、MorePasteをダウンロードできるようにするために、いろいろと準備をしている。ドキュメントの整備とかが主なんだけど、リファレンスマニュアルなんかは、結構、作り始めると時間がかかっちゃう。今まで、特に機能を定義することなんてせずに、思いつきで作ってきているからねぇ。本当、行き当たり、ばったり。

どうも、やっぱり、クリップボードを経由して処理をするってのは、OSによる動作の違いが出てきそうで、いまいち自信を持って、こう動きます、とは書けない。まぁ、動作を保証するつもりもないんだけどね。

リファレンスを書いていて、タブを空白文字に置き換える機能で、おかしな動作を見つけた。タブ幅を入力して、任意の幅に指定する機能で、数字以外の文字を入力すると動作がおかしくなる。数字以外の場合、デフォルトの「16」に自動的に書き戻して、さらに「4」に選択しなおすようになっているんだけど、その後、テキストボックスの操作が全くできなくなる。

さらに、再び「Other」を指定して、テキストボックスを入力できる状態にしても、キーボードからの操作に反応しない。キーボードリスナがどこかに行っちゃったのかしら。カーソルの動作もあんまりうれしくないし、フォーカスも変だし。うーん。

数字以外の文字を入れた場合、内部的には、例外で処理している。NumberFormatExceptionのcatch節で、テキストボックスの設定の変更とかをしているわけだ。調べてみると、どうも、テキストボックスをsetEnabled( false )している処理が問題らしい。こういうんじゃぁ、直しようがないな。

結局、仕様を変更することにした。「4」を選択しなおすのはやめにして、「Other」が選択されたままにすることにする。とりあえず、setEnabled( false )しないから、動作の問題はなくなるし。前の仕様がよかったかというと、なんとも言えないので、まぁ、いいことにしよう。

全く、どういうことなんだろうねぇ。ああぁ、BoxFillも確認してみないと。

■20020111

引き続き、リファレンスマニュアル作成中。動作確認しながら、ってのはなかなか、連続して作業が進まない。やっぱり、チェックして行くと、いろいろ出てくるもんだ。

BoxFillは昨日のうちに動作の確認をしていて、で、問題発見。数字以外の場合については、タブを空白文字で置き換えるのと同じ処理をしていたんだけど、setEnabled()を呼び出していないせいか、目立った動作上の問題は無かった。でも、何となく、0より小さいマイナスの数を入れてみたら、スタックオーバーフローになった。やっぱりね。タブの方も同様。例外は飛ばないんだけど、処理はできない、ってな状況が起こりうるってことね。そりゃそうだ。

PasteQuote、BoxFill、Tab2Spaceは、全て、変換処理が別のクラスになっていて、委譲の関係になっている。タブ幅とか、1行の長さとかは、get/setのメソッドで処理を委譲するクラスに値を設定すようにしている。結局、このsetのメソッドがbooleanを返すようにして、委譲先にチェックさせることにした。UIは、直前にした変換の値に戻すことにしましょ。

Combinationは、追加と削除の動作がどうも自然じゃない。どこが選択されているか、に関係なく、クリックしたアイテムが操作の対象となる。これはこれで、わかりやすいことはわかりやすいんだけど、いまいち、一般的な動作と違うんだよね。何でこんな仕様にしたんだ。まぁ、今となっては知る由も無く。変なの自分で作ったのに。

選択を優先するように動作を変えるとして。複数選択されてる時の、追加の方はどうしたものか。とりあえず、この場合は、クリックされたアイテム優先かなぁ。

■20020114

1.0をリリースしました。やっとスタート。1.0をリリースしたのは、1.1を作り始めるためだからね。1.0の問題は、いろいろ感じていたわけなんだけど、まぁ、早めにリリースしたかったからねぇ。とりあえず、このままで行きます。自分がWindows環境なので、zipで固めて圧縮。問題あれば、その時また考えるということで。

ということで、1.1に向けて修正。早速、手を加えて、「MorePaste.jar」という今まで固定だったファイル名を変えられるようにした。今までファイル名が固定だったのは、「About...」の画像を読み出す処理を自作していて、自分自身をjava.util.jarのクラスに開かせていたためなのさ。

「自分のファイル名を取れないなんて、javaって不便だね」と思っていたんだけど、そんなこと、そもそもする必要なかったんだよね。自分を起動したファイルは、クラスパスに含まれるようになっていて、getClass().getClassLoader().getResource()でjarの中身にアクセス出来ちゃう。後は、そのまま、ImageIconクラスの引数に渡してやればいい。

これって、どこで知ったんだっけな。

■20020120

1.0のCheckBoxListModelのコラムを書いていて、問題があることに気がついた。このクラスは、javax.swing.DefaultListModelを継承している。DefaultListModel自体、内部にVectorを持っていて、新たにフィールドとして追加した2つのVectorとあわせて、3つのコレクションが同じインデックスで関連したデータを保持する構造になっている。

作ったときから、インデックスがずれる、という状況を懸念していて、でも特に何も対策せずに来ていた。1.0のリリース版でもそのまま。1.0じゃ、プログレスバーとか、マルチスレッドな処理はないので、synchronizedにもしてない。でも、まぁ、この際だからしちゃいましょ。ということで、1.0.1かなぁ。

でも、それとは別のインデックスがずれる状況を思いついた。DefaultListModelに型キャストされたとき。継承で作っている以上、ダウンキャストはどうしようもない。自分では、こういう処理はしないだろうからいいんだけど、どこまで対応すべきなのかね。

1.1では、CheckBoxListModelは実装方法を大幅に変えていて、synchronizedブロックにもしているし、インデックスがずれることは心配していないんだけど。それでも、やっぱり継承とダウンキャストの問題は出ちゃう。どうしたものか。

■20020126

先日、Java2 Standard Editionの1.4のRCが出た。ほんの3、4日前。ベータ版の間は何となく入れるのに躊躇してたんだけど、RCならいいでしょ。ということで、インストールして、いくつか機能を試してみた。

JTabbedPaneのスクローラブルなタブは、なかなかいい感じ。やっぱり、タブは1列の方がすっきりして見栄えがいい。MorePasteだと、すべてのタブが一覧できる必要はないからね。まぁ、タブにする必然性もないと言えばないんだけど。本当は、この辺りは、使いやすくするにはどうすればいいのか、ってのをちゃんと考えなきゃいけないんだよな。

そろそろ開発のベースを1.4にしようかね。

ところで、1.4と1.3両対応のMorePasteを作ろうと遊んでいて、どうしようか、ということに出くわした。Javaは、System.getProperty("java.version")でランタイムのバージョンを取得出来る。だけど、この取得できるのが文字列なんだよね。今回なんかは、"1.4.0-rc"。おいおい、よりによってアルファベットまで入ってるのかよ。それじゃぁ、数字にキャストも出来ないじゃないか。

1.4以上だったら、というふうに、大小でバージョンチェックができれば一番処理はしやすい。だけど、多分、バージョンの先頭に数字がくる、ってのも保証されているわけじゃないんだよね。勝手に思い込みで作るわけにもいかないしな。うーん。個々のパッケージでバージョンが衝突したりとか、ランタイム系のバージョン管理については、JavaSoftは仕様作りに手を抜いたとしか言いようがないね。そういうところは、本当、矛盾が噴出してきている感じ。やれやれ。

■20020129

ちょっと時間が出来たので、1.4。MorePasteを1.3と1.4の両対応にする、という話の続き。バージョン確認の話は、とりあえず、System.getProperty("java.version")の先頭の文字をチェックすることでよしとする。もうちょっとユニバーサルな解決法は、またどこかで探すことにしましょ。エレガントなのを誰かが作ってるでしょ。

さっそく、BoxFillのタブで、1行の長さとオフセットの長さを入力するテキストボックスを、1.4の場合はJSpinnerで置き換えるっていう機能を入れてみた。スピンボタンってのは、一時期、流行ったんだよね、Beanの実装の例でさ。本当、そこら中の雑誌でやってた。

JSpinnerってのは、なんでJSpinButtonじゃないのかなと、不思議に思っていた。で、使ってみ納得。理由はボタンじゃないから。JPanelが親で、JFormattedTextFieldとボタンが並んで出来ている。Delphiとかだとさ、IDEの存在が前提になっているから、プロパティシートでテキストフィールドと結びつける、なんてことが簡単に出来ちゃう。だから、ボタンとして定義しておいて問題ないんだろうけど、Javaじゃそういうのはなし、ってことね。今までのとは違って、なんだか高レベルな複合コンポーネントになってます。

それでも作りは素直で、コンストラクタでSpinnerNumberModelのインスタンスを引数に渡してやると、数字が上下するUIが出来上がっちゃう。現在の値とか、最大、最小を設定するのにプリミティブ型で指定できない、ってのは不便。まぁ、これは日付とかリストのスピンボタンとの互換性を考えると、しかたないか。ということで、出来上がり。

こういう高レベルのコンポーネントをどうするかってのは、行番号表示の機能をJarViewで作ったときに、ちょっと考えた。行番号表示は、スクロールバーの存在が前提になるから、結局JScrollPaneが親になっちゃう。いい意味での素直さが、損なわれちゃうような気がして。JavaSoftがこういう作り方をしちゃった、ってのは、ある意味、英断なんだろうけど。

ところで、なんで、MetalのUIなのに、JSpinnerだけWindowsのスタイルなんだ? なんだかなぁ。

おしまい
Mail to author Mail to author. Top of this page.

[This page was updated: 2003-03-09 ]

 

 
Copyright © 2001-2003 Takashi KOBAYASHI. All Rights Reserved.