フォーカス 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 setFocusableWindowState(boolean focusableWindowState)

    public void addPropertyChangeListener(PropertyChangeListener listener)

    public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener)

次を java.awt.Frame の javadoc に追加:

/**
 * Frames are capable of generating the following types of WindowEvents:
 * WindowOpened, WindowClosing, WindowClosed, WindowIconified,
 * WindowDeiconified, 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 を無効にすることが、デフォルトの FocusTraversalPolicy を Swing デフォルトの javax.swing.LayoutFocusTraversalPolicy から AWT デフォルトの java.awt.DefaultFocusTraversalPolicy に戻すセマンティクスを持つようになりました。

javax.swing.DefaultFocusManager への変更

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

クライアントコードがレガシー DefaultFocusManager をインストールする場合、public 以外の LegacyGlueFocusTraversalPolicy をインストールすることで下位互換性を提供します (FocusTraversalPolicy メソッド呼び出しを DefaultFocusManager 上の対応するメソッドに経路指定します)。

javax.swing.JComponent への変更

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

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

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

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

javax.swing.JInternalFrame への変更

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

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

javax.swing.KeyStroke への変更

既存の KeyStroke クラスは Component ごとのフォーカストラバーサルキー API を設計するのに役立つため、このクラスは少量の変更で java.awt.AWTKeyStroke として AWT に昇格されました。Swing クラスが AWT クラスのサブクラスになりました。

KeyStrokegetKeyStroke(char, boolean) 内の廃止されたメソッドは AWT に昇格されませんでした。このため、このメソッドが AWTKeyStroke 標準キャッシュスキームに参加するための単純な方法はありません。このメソッドの仕様は、実装がこのメソッドから返されたインスタンスをキャッシュする必要がないことを特に説明するように、変更されました。

javax.swing.SwingUtilities への変更

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


Copyright © 1993, 2013, Oracle and/or its affiliates. All rights reserved.