Developer'sWorks
Java自体の動作差異(JDK1.3⇒JDK1.4)

JDK1.3.X → JDK1.4.X にて、Swingの大幅変更が行われました。
そのメインとなるのが、「フォーカス周りの制御」になります。JDK1.3.X にて発見されている多数の フォーカス絡みの不具合を修正するためにイベント制御方法もガラっと変わっています。
詳細なドキュメントは Sun The AWT Focus Subsystemにて記述されています。

Webtribe,VisualFrameのJavaクライアントでは、Swingをベースに作成されているため、Swingの仕様変更個所は注意が必要になります。
Swingの変更内容などは、JDKのドキュメントを参照して頂くしか方法はないのですが、 JDK1.4.Xでの具体的な動きの差や注意点など私共で気づいた範囲を記述し、バージョン移行の補足材料にしていただければと思います。

Swingについての内容になりますので、間違い、足りないもの などがある可能性があります。予めご了承ください。
また、お気づきの点などありましたら情報よろしくお願いします。

表示上の差異

  1. ラベル(JLabel)の前景色 のデフォルト値が変更になった(L&F=Metal)
    JDK1.3でのデフォルトColorは 「むらさきっぽい色」でしたが、JDK1.4 では「黒色」になっています。
    CAMCのコンポーネント属性に明示的に「前景色=黒」と設定している場合にはその指定を削除するとリポジトリの軽量化(=レスポンスUp) が可能です。
    JDK1.3JDK1.4


  2. メッセージ用モーダルダイアログ(JOptionPane)のボタン、アイコンの変更
    JOptionPaneにて 「ボタンにニーモニックキーの追加」、「アイコンイメージ変更」されています。
    「ボタンにニーモニックキーの追加」は、Yes,Noのボタンがあるダイアログについて標準で追加されています。
    JDK1.3JDK1.4

  3. JFileChooserの変更
    JFileChooserにて細かな変更が随所にあります。
    たとえば、ドライブ接続しているものの、接続先文字列が表示される
    JDK1.3JDK1.4
    「リスト表示」がJDK1.3にて使えなかったが使えるようになっている など。
    各種詳細を調査して現状どおり使用できるかどうか確認する必要があります。
  4. Marginなどのサイズ変更
    Margin、Insert などのサイズが変更されているため、JDK1.3にて正確にサイズ調整されたコンポーネントもJDK1.4では 全て表示しきれない などが発生する可能性があります。
    (Margin,Insetなどのサイズは、UIに依存します)
  5. ツールチップの表示タイミング
    ツールチップが表示されるまでの タイミングが JDK1.3 と比べ若干差が発生しています。

    ●チップ表示無し状態から チップを表示する
    JDK1.3 一秒ほど待ってから表示される
    JDK1.4 一秒ほど待ってから表示される

    ●チップ表示有り状態から 他Compにマウス移動
    JDK1.3 チップ消え、一秒ほど待ってから表示される
    JDK1.4 すぐに新しいチップ内容が表示される
    (表示待ち時間なし)

  6. Java2Dを使用した印刷
    JDK1.4.1 以降にて実行した場合で、OSの使用色が 16ビット の場合、印刷のイメージが異なってしまいます。
    (色が反転したような感じになる)
    AWT印刷(OSの機能を使用して印刷 参考ページ: JavaAWT:印刷 ) にて 印刷を行うと 16ビット でも正常に印刷できることを確認しました。

イベントの差異

  1. 画面(JFrame,JDialog)に対して addKeyListener をしてもイベントが発生しない
    JDK1.4からは、画面(JFrame,JDialog)に対して addKeyListener を行ってもイベントが発火されません。
    Listenerに対するKeyイベント発火はjava.awt.Component#processKeyEventより 行われていましたが、JDKドキュメントにもあるように、「コンポーネントがフォーカスを所有していない場合、またはコンポーネントが表示されていない場合は、このメソッドはイベントディスパッチスレッドから呼び出されません」 そのため、フォーカスを取得しない画面インスタンスに対してはイベントが発火されません。
    変わりに、java.awt.KeyEventPostProcessor を使い、イベントをPostしてもらうように java.awt.KeyboardFocusManager に 登録することにより、イベント取得が可能になります。
    PostProcessorの機能については、Sun The AWT Focus Subsystemをご覧下さい。
    標準ルールの SetFrameFunctionKeyListener については、上記のPostProcesserを登録することによりイベントを取得するように 変更されていますのでそのままお使いいただけます。

    但し、PostProcesserに登録した場合、KeyboardFocusManagerからダイレクトにイベントを実行するため、Component.processEventとは別系統になります。 つまり、コンポーネントのイベントを消す事はできません。
  2. メニュー表示のショートカット(F10)の登録タイミング変更
    JDK1.3では onLoad時に KeyMap を実行すると、Swingデフォルトのメニュー表示のショートカット(F10)の登録の後に実行されましたが、 JDK1.4では onLoad時では KeyMapの処理が最初に動いてしまう為、登録される優先順位が F10の登録→任意にKeyMapの登録 となってしまいます。
    (つまり、KeyMapの登録をF10に対して行った場合、F10を押すと メニューは開くが、登録した処理は動かない となります。)

    JDK1.3時と同様に、任意に登録するKeyMapを優先させる為には onOpen時(Ver1.1より新規追加イベント)にイベントを入れる必要があります。

    この登録タイミングの差は、JDK1.4のJMenuBarではKeyMapを public void addNotify() メソッド実行時に登録するように変更されたためです。
  3. (Shift)Tab,(Shift)Ctrl+Tabでのフォーカス挙動の差
    JDK1.4では 「FocusCycleRoot」というのを明示的に認識しているため、Tab,Ctrl+Tabによるフォーカス遷移の挙動も変更されています。
    Tab は "FocusCycleRoot内の次のコンポーネントに遷移" という動きを行い、Ctrl+Tab は "FocusCycleRootを抜ける"という動きになります。
    JDK1.3でも テーブル に対しては同じ動きになっています。テーブル 自体をFocusCycleRootと捉え、Tab を押すとテーブル内セルフォーカスを 移動し、Ctrl+Tabを押すと テーブルを抜け(FocusCycleRootを抜け) 次のコンポーネントにフォーカス遷移します。
    このような概念が、JDK1.4では SplitPaneなどについても適用されています。
    そのため、明示的に「FocusCycleRootの切替」を行わないと、CAMC#フォーカス移動順 の設定と異なる動作をする場合があります。

    JDK1.4よりフォーカス遷移のポリシーを別途登録する事が可能です。(java.awt.DefaultKeyboardFocusManager#setDefaultFocusTraversalPolicy)
    Webtribe/VisualFrame Javaクライアントのデフォルトでは javax.swingLayoutFocusTraversalPolicy を継承し作成されています。
    動きを変更したい場合には独自にPolicyを作成し設定することも可能ですが、CAMC#フォーカス移動順 は反映されなくなります。(独自で処理を記述する必要があります)

  4. ボタンをクリック時、直前の処理時間が長い時の挙動
    JDK1.4では重い処理中に マウスプロセス、キープロセス が Stack されると、それらの プロセスは 操作順に Callされなくなりました。
    例えば、テキストのAfter(フォーカス紛失前) のタイミングにて、処理中に
    1.マウスクリック
    2.「A」と Key入力
    3.マウスクリック
    4.「B」と Key入力
    とされた場合、処理終了後の イベント発生は 1. → 3. → 2. → 4. となります。
    (この現象により、VisualFrameでは、 処理中の先行入力不可 の仕様に変更されました。)
  5. その他イベント処理の差
    JDK1.4により、Keyイベント処理、フォーカス処理のロジックなど大幅に変わっています。(Sun The AWT Focus Subsystem) そのため、イベント発行タイミングやフォーカス移動処理の順番、処理の記述場所 など変更されている部分が多数あります。
    VisualFrame標準機能として提供している部分については同じ動作になるよう変更していますが、独自でビジネスルールを作成してSwingコンポーネントに対する処理などしている部分に 関して正常に動くかどうかのテストは注意して行うようお願いします。

JDK1.4にて標準追加されたもの

  1. XMLパーサーが標準で付属
    XMLパーサーが標準で付属するようになりました。VisualFrameにてHttpアクセスする際XMLパーサー(Xalan,Xercesなど)が必要でしたが、 JDK1.4(VisualFrame Ver1.1.0) からは必要なくなりました。

  2. JScrollPaneのMouseWheelが標準で動作
    JScrollPaneのスクロールが、MouseWheelにて動作するようになりました。JScrollPaneを使用している、テーブル、リスト、テキストエリア、 画面(JFrame,JDialog)などはMouseWheelにてスクロールが可能になります。

deprecatedされたメソッド達

以下はJDK APIドキュメントの文章を引用しています

  1. JComponent#isManagingFocus()
    推奨されていません。 1.4 以降は Component.setFocusTraversalKeys(int, Set) と Container.setFocusCycleRoot(boolean) に置き換えられました。
  2. JComponent#requestDefaultFocus()
    推奨されていません。 JDK バージョン 1.4 以降は FocusTraversalPolicy.getDefaultComponent(Container).requestFocus() に置き換えられました
  3. JComponent#setNextFocusableComponent
    推奨されていません。 JDK バージョン 1.4 以降は、FocusTraversalPolicy に置き換えられました。
  4. JComponent#isFocusTraversable()
    推奨されていません。 JDK バージョン 1.4 以降は、isFocusable() を使用
  5. URLEncoder#encode(String s)
    推奨されていません。 結果の文字列は、プラットフォームのデフォルトの符号化方式により異なる場合がある。あるいは、encode(String,String) メソッドを使用して符号化方式を指定する
  6. FocusManager
    このクラスは 1.4 focus API で現在使われていません。クライアントコードで使うことはできますが、開発者に対しては、java.awt.KeyboardFocusManager および java.awt.DefaultKeyboardFocusManager に移行することを強く推奨します。詳細は 「Focus Specification」を参照してください。