このドキュメントでは、新しいフォーカスモデルに対応するために AWT と Swing に加えられた API 変更について概要を説明します。変更の概要については、まずここをお読みください。
既存のクラスへの変更:
新規クラス:
次を java.awt.AWTEvent
に追加:
public void setSource(Object newSource)
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)
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()
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)
このクラスは廃止されました。新しいアプリケーションは、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
上の対応するメソッドに経路指定します)。
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
と同様に、JInternalFrame
は java.awt.KeyboardFocusManager
でフォーカス管理を集中化する前から getFocusOwner()
メソッドを残していました。API を完全なものにし、Window との一貫性を保つために、Window
の対応するメソッドと同じ仕様の getMostRecentFocusOwner()
が JInternalFrame
に追加されました。
setFocusCycleRoot/isFocusCycleRoot
: これらのメソッドは、JInternalFrames
に AWT の最上位 Windows
と同様のセマンティクスを与えます。JInternalFrame
は常にフォーカスサイクルルートである必要があるため、これらのメソッドはその制限を適用するようにオーバーライドされて final 宣言されます。ただし AWT Window
とは異なり、JInternalFrame
は JDesktopPane
などのフォーカスサイクルルート祖先を持つことができます。このため、Component.getFocusCycleRootAncestor()
は Window
内のように JInternalFrame
内で final 宣言されません。
既存の KeyStroke
クラスは Component
ごとのフォーカストラバーサルキー API を設計するのに役立つため、このクラスは少量の変更で java.awt.AWTKeyStroke
として AWT に昇格されました。Swing クラスが AWT クラスのサブクラスになりました。
KeyStroke
、getKeyStroke(char, boolean)
内の廃止されたメソッドは AWT に昇格されませんでした。このため、このメソッドが AWTKeyStroke
標準キャッシュスキームに参加するための単純な方法はありません。このメソッドの仕様は、実装がこのメソッドから返されたインスタンスをキャッシュする必要がないことを特に説明するように、変更されました。
javax.swing.SwingUtilities
への変更
findFocusOwner:
このメソッドは廃止されました。その機能は KeyboardFocusManager.getFocusOwner()
で置き換えられています。