API の変更点について

このドキュメントでは、新しいフォーカスモデルを格納するために AWT と SWING に加えられた API の変更について説明します。 変更の概要については、まずここをお読みください。

既存クラスの変更:

新規クラス:

java.awt.AWTEvent へ追加:

    public void setSource(Object newSource)

java.awt.Component の変更点:

    public boolean isFocusTraversable()

    public boolean isFocusable()

    public void setFocusable(boolean focusable)

    public void setFocusTraversalKeys(int id, Set keystroke)

    public Set getFocusTraversalKeys(int id)

    public void setFocusTraversalKeysEnabled(boolean focusTraversalKeysEnabled)

    public boolean getFocusTraversalKeysEnabled()

    public void requestFocus()

    protected boolean requestFocus(boolean temporary)

    public boolean requestFocusInWindow()

    protected boolean requestFocusInWindow(boolean temporary)

    public void transferFocus()

    public void transferFocusBackward()

    public void transferFocusUpCycle()

    public Container getFocusCycleRootAncestor()

    public boolean isFocusCycleRoot(Container container)

    public boolean hasFocus()

    public boolean isFocusOwner()

    public void addPropertyChangeListener(PropertyChangeListener listener)

    public void removePropertyChangeListener(PropertyChangeListener listener)

    public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener)

    public void removePropertyChangeListener(String propertyName, PropertyChangeListener listener)

    public void firePropertyChange(String propertyName, boolean oldValue, boolean newValue)

    public void firePropertyChange(String propertyName, int oldValue, int newValue)

    public boolean isFontSet()

    public boolean isBackgroundSet()

    public boolean isForegroundSet()
  
    public boolean isCursorSet()

    public boolean areFocusTraversalKeysSet(int id)
    

java.awt.Container の変更点:

    public void setFocusTraversalKeys(int id, Set keystroke)

    public Set getFocusTraversalKeys(int id)

    public void setFocusTraversalPolicy(FocusTraversalPolicy policy)

    public FocusTraversalPolicy getFocusTraversalPolicy()

    public void setFocusCycleRoot(boolean focusCycleRoot)

    public boolean isFocusCycleRoot()

    public boolean isFocusCycleRoot(Container container)

    public void transferFocusDownCycle()

    public void addPropertyChangeListener(PropertyChangeListener listener)

    public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener)

    public boolean areFocusTraversalKeysSet(int id)

    public boolean isFocusTraversalPolicySet()

java.awt.Window の変更点:

    public void toFront()

    public void toBack()

    public Component getFocusOwner()

    public Component getMostRecentFocusOwner()

    public boolean isActive()

    public boolean isFocused()

    public final void setFocusCycleRoot(boolean focusCycleRoot)

    public final boolean isFocusCycleRoot()

    public final Container getFocusCycleRootAncestor()

    public boolean isFocusableWindow()

    public void setFocusableWindow(boolean focusableWindow)

    public void addPropertyChangeListener(PropertyChangeListener listener)

    public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener)

次のドキュメンテーションコメントをjava.awt.Frame の javadoc に追加:

/**
 * Dialogs are capable of generating the following WindowEvents:
 * WindowOpened, WindowClosing, WindowClosed, WindowActivated,
 * WindowDeactivated, WindowGainedFocus, WindowLostFocus.
 */

次のドキュメンテーションコメントをjava.awt.Dialog の javadoc に追加:

/**
 * Dialogs are capable of generating the following WindowEvents:
 * WindowOpened, WindowClosing, WindowClosed, WindowActivated,
 * WindowDeactivated, WindowGainedFocus, WindowLostFocus.
 */

java.awt.event.FocusEventに追加:

    public FocusEvent(Component source, int id, boolean temporary, Component opposite)

    public Component getOppositeComponent()

次のドキュメンテーションコメントを java.awt.event.WindowEvent の javadoc に追加:

/**
 * A low-level event that indicates that a window has changed its status. This
 * low-level event is generated by a Window object when it is opened, closed,
 * activated, deactivated, iconified, or deiconified, or when focus is
 * transfered into or out of the Window.
 */

java.awt.event.WindowEventに追加:

    public static final int WINDOW_ACTIVATED

    public static final int WINDOW_DEACTIVATED

    public static final int WINDOW_GAINED_FOCUS

    public static final int WINDOW_LOST_FOCUS

    public WindowEvent(Window source, int id, Window opposite) 

    public Window getOppositeWindow()

java.awt.event.WindowListenerに追加:

    public void windowActivated(WindowEvent e)

    public void windowDeactivated(WindowEvent e)

java.awt.event.WindowAdapterに追加:

    public void windowGainedFocus(WindowEvent e)

    public void windowLostFocus(WindowEvent e)

java.awt.AWTEventMulticaster に追加:

    public void windowGainedFocus(WindowEvent e)

    public void windowLostFocus(WindowEvent e)

javax.swing.FocusManager の変更

このクラスは廃止されました。 新しいアプリケーションでは、 java.awt.KeyboardFocusManager のみ使用してください。 ただし、既存のアプリケーションに対する (アプレットは除く) 下位互換性は残っており、独自の FocusManager を定義できます。

Swing FocusManager は、新しい AWT KeyboardFocusManager のサブクラスに変更されました。 FocusManager.setCurrentManager(FocusManager) および FocusManager.getCurrentManager() は、それぞれ KeyboardFocusManager.setCurrentKeyboardFocusManager(KeyboardFocusManager) および KeyboardFocusManager.getCurrentKeyboardFocusManager() のラッパーに変更されました。

これにより、呼び出し側スレッドにアクセス権 「replaceKeyboardFocusManager」 が許可されない場合 KeyboardFocusManager.setCurrentKeyboardFocusManager(KeyboardFocusManager)SecurityException をスローするようになるため、この変更に関して多くの議論が起こりました。 これまでのバージョンでは、FocusManager.setCurrentManager(FocusManager)SecurityException をスローすることはありませんでした。 複雑なクラスを設計してこの問題を避けることはできましたが、提案されていた設計の明解さと簡潔さは、下位互換性に関するわずかな問題よりも重要であると考えました。

disableSwingFocusManager() および isFocusManagerEnabled() は使用するべきではありません。 Swing FocusManager を無効にすることにより、デフォルトの FocusTraversalPolicyjavax.swing.LayoutFocusTraversalPolicy の Swing デフォルトから java.awt.DefaultFocusTraversalPolicy の AWT デフォルトに戻すセマンティクスを提供できるようになりました。

javax.swing.DefaultFocusManager の変更

このクラスは廃止されました。 新しいアプリケーションでは、 java.awt.KeyboardFocusManager のみ使用してください。 ただし、既存のアプリケーションに対する (アプレットは除く) 下位互換性は残っており、独自の DefaultFocusManager を定義できます。

クライアントコードが従来の DefaultFocusManager をインストールする場合、public 以外の LegacyGlueFocusTraversalPolicy をインストールすると下位互換性が提供されます。これによって FocusTraversalPolicy メソッド呼び出しが DefaultFocusManager の対応するメソッドに渡されます。

javax.swing.JComponent の変更

isManagingFocus: このメソッドは廃止されました。 isManagingFocusJComponent のフォーカストラバーサルキーを TAB および SHIFT-TAB から CTRL-TAB および CTRL-SHIFT-TAB に変更しました。 また、フォーカストラバーサルが自動的に JComponent にならないよう、JComponent をマークしました。 これは JComponent をフォーカスサイクルルートとして指定することと似ていますが、別のものです。 その機能は FocusTraversalPolicy クラス、コンポーネントごとのフォーカストラバーサルキー、およびコンポーネントのフォーカストラバーサルキーをまとめて無効にする機能に置き換えられました。

setNextFocusableComponent/getNextFocusableComponents: これらのメソッドは廃止されました。FocusTraversalPolicies ではフォーカストラバーサルをアルゴリズムで表現できるようになり、信頼性が高くなっています。 これらのメソッドは、アプリケーションがコンポーネントから別のコンポーネントへのフォーカストラバーサルをハードコードするよう強制します。

setRequestFocusEnabled/isRequestFocusEnabled の仕様が変更され、requestFocusEnabled プロパティは現在の Look&Feel に対するヒントになります。

requestDefaultFocus: このメソッドは廃止されました。 このメソッドの機能は FocusTraversalPolicy.getDefaultComponent(Container).requestFocus() で置き換えられています。

javax.swing.JWindow の変更

setFocusableWindow/isFocusableWindow: これらのメソッドは JWindow で final 宣言され、「null」所有者に構築されたすべての JWindows は non-focusable であるという制限が適用されます。 Swing で JWindows を構築して、JWindows が私有で非表示の Frame に所有されるため、また、新しいフォーカス実装に、Window やその子孫を対象にした KeyEvents がその Frame でプロキシされる必要があるため、こうした制限が必要になります。 X11 ではフォーカスを設定するために window をマップする必要があるので、「null」所有者を持つ JWindow は X11 で KeyEvents を受け取ることができません。

javax.swing.JInternalFrame の変更

getMostRecentFocusOwner: java.awt.Window と同様、JInternalFramejava.awt.KeyboardFocusManager でフォーカス管理を集中化する以前から getFocusOwner() メソッドを残していました。 API を完成し、Window に対して一貫性を保つために、getMostRecentFocusOwner()JInternalFrame に追加されました。仕様は Window で対応するメソッドと同じです。

setFocusCycleRoot/isFocusCycleRoot: これらのメソッドは、JInternalFrames に AWT の最上位 Windows と同様のセマンティクスを与えます。 JInternalFrame は常にフォーカスサイクルルートである必要があるので、これらのメソッドがオーバーライドされて final 宣言され、制限が適用されます。 ただし AWT Window とは異なり、JInternalFrame には JDesktopPane のように元になるフォーカスサイクルルートがある場合があります。 このため、Component.getFocusCycleRootAncestor()Window の場合のように JInternalFrame で final 宣言されることがありません。

javax.swing.KeyStroke の変更

既存の KeyStroke クラスを使って 各 Component にフォーカストラバーサルキー API を設計することができたので、このクラスはあまり変更されずに java.awt.AWTKeyStroke として AWT に変更されました。Swing クラスが AWT クラスのサブクラスになりました。

KeyStroke で推奨されないメソッド getKeyStroke(char, boolean) は AWT に変更されませんでした。 このため、このメソッドを標準の AWTKeyStroke キャッシングスキームに簡単に関与させる方法はありません。 このメソッドの仕様は変更され、実装にはこのメソッドから返されたインスタンスをキャッシュする必要がないことが注意事項に追加されました。

javax.swing.SwingUtilities の変更

findFocusOwner: このメソッドは廃止されました。 このメソッドの機能は KeyboardFocusManager.getFocusOwner() で置き換えられています。