« カルテ保存後ウインドウを閉じる(多分完結編) | トップページ | Drag & Drop のインターフェース »

2009年10月29日 (木)

結局 Java 1.6 へ移行

ずっと Java 1.5 で行くつもりだったが,ヒマだったのでやっぱり Java 1.6 に移行することにした。サーバ環境を jboss-4.2.3.GA + jdk6 に,クライアントも Snow Leopard の Java 1.6 環境にした。カルテ検索が動かなくなるなどいろいろあって,思ったより結構大変な作業になってしまった。しかし,苦労した甲斐あって,Java 1.6 にしてちょっと操作性がよくなったし,レスポンスも早くなったような感じもあるかもしれなくもない。

  • サーバは xen の dom-U で走っている Debian Etch である。Etch に Java 6 をインストールするには,backport を使う。
    1. /etc/apt/sources.list に以下を加える。
      deb http://www.backports.org/debian etch-backports main contrib non-free
      
      
    2. キーを取得
      # wget -O - http://backports.org/debian/archive.key | apt-key add -
      
      
    3. Java 1.6 インストール
      # aptitude update
      # aptitude install sun-java6-jdk
      
    4. JAVA_HOME を,Java 6 を使うように設定。
    5. ちょっと古いけど問題なく動いた
      $ java -version
      java version "1.6.0_07"
      Java(TM) SE Runtime Environment (build 1.6.0_07-b06)
      Java HotSpot(TM) Client VM (build 10.0-b23, mixed mode, sharing)
      
    6. JBoss 4.2.3 では,起動スクリプトでJBOSS_HOST のアドレスを書き換えてきちんと設定しないと接続を受け付けないので注意。 ダウンロード jboss423_init_debian.sh (3.2K)
  • Java 1.6 では swing-layout が標準で入っているので,lib から swing-layout-1.0.3.jar は外してかまわない。ただし,NetBeans で Matisse を使っているコード(LoginView.java 等の xxxView.java 系)では,強制的に swing-layout-1.0.3.jar が使われてしまう。Java 1.6 標準のものを使うには,全ての xxxView.java で,インスペクタのルートを右クリックして「プロパティー」を選択し,「レイアウト生成スタイル」を「標準 Java 6コード」に変更する。
  • java 1.6 では SwingWorker も標準になったので,swing-worker-1.1.jar も外せるはずなのだが, appframework-1.3.jar がこれを使う仕様のため外せない。Java 1.6 標準の SwingWorker を使うようにコンパイルし直したライブラリを使うと外せる。
    1. Swing Application Framework のサイト から,ソースをダウンロードして,NetBeans に読み込む。普通に「プロジェクトを開く」で開ける。
    2. AppFramework プロジェクトのライブラリから SwingWorker を削除すると,エラーマークが付く。
    3. org.jdesktop.application パッケージの Task.java と TaskMonitor.java の import 文から,エラーになっている文を削除し,import javax.swing.SwingWorker で置き換える。
    4. エラーマークが消えるので,構築する。これで,Java 1.6 標準の SwingWorker を使った AppFramework.jar ができあがり。ダウンロード AppFramework.jar (567.0K)
  • Java 1.6 では JTree.DorpLocation クラスが導入されて,JTree の項目と項目の間に挿入できるようになった。今までスタンプ箱は,「フォルダの上に置いたらフォルダの前に挿入,ALT を押していたらフォルダの中へ」という風にカスタマイズしており,スマートでないと常々思っていた。JTree.DropLocation を使えば,「フォルダの前後に置いたらフォルダの前後へ,フォルダに重ねたら中へ」という直感的なインターフェースにできるはずである。と簡単に思ってやってみたら実はそんなに簡単な話ではなく,結局ロジックを大幅に見直すことになってしまった。しかも JTree.DropLocation は使わずじまい。
  • さらに JTable.DropLocation も加わったので,JTable の行の入れ替え操作も,行の間に線が出て挿入場所が直感的に分かるようになった。これは JTree に比べるとずっと簡単に組み込めるのだが,なんと quaqua が対応しておらず,結局 renderer から作るはめに。
  • Java 1.6 では,TableRowSorter が標準で入っており,TableSorter.java を組み込まなくても JTable#setAutoCreateRowSorter(true) だけでできてしまう。
    • ただし,TableModel と Table の 対応関係がずれるので,int selected = table.convertRowIndexToModel(table.getSelectedRow()) とか置き換えなくてはならない。これに伴い,TableSorter.java を組み込む改変はやめて,setAutoCreateRowSorter(true) でソートするようにコードを書き直してみた。
    • そうすると,動的 startNumRow にしているために,ソートすると何も入っていない項目を含めてソートされてしまい,ソートしたとき何も入っていない項目が上の方に表示されてしまうというなさけない事態に。動的 startNumRow はとりやめ,代わりに,quaqua の JTable#putClientProperty("Quaqua.Table.Style", "striped") を設定して対応した。
    • この変更で,テーブル表示が quaqua 依存になってしまった。また,テーブルの範囲が項目がある範囲だけになったので,テーブルにドラッグ&ドロップする場合の動作など,細かいところに手を入れることになった。思ったより大変だった。
    • テーブル表示を quaqua に依存しない Windows バージョン(動的 startNumRow + TableSorter.java)と,quaqua に依存した Macintosh バージョンのソースを分けることにした。

« カルテ保存後ウインドウを閉じる(多分完結編) | トップページ | Drag & Drop のインターフェース »

OpenDolphin」カテゴリの記事