このドキュメントでは、新しいフォーカスモデルを格納するために 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
を無効にすることにより、デフォルトの FocusTraversalPolicy
を javax.swing.LayoutFocusTraversalPolicy
の Swing デフォルトから java.awt.DefaultFocusTraversalPolicy
の AWT デフォルトに戻すセマンティクスを提供できるようになりました。
javax.swing.DefaultFocusManager
の変更 このクラスは廃止されました。 新しいアプリケーションでは、 java.awt.KeyboardFocusManager
のみ使用してください。 ただし、既存のアプリケーションに対する (アプレットは除く) 下位互換性は残っており、独自の DefaultFocusManager
を定義できます。
クライアントコードが従来の DefaultFocusManager
をインストールする場合、public 以外の LegacyGlueFocusTraversalPolicy
をインストールすると下位互換性が提供されます。これによって FocusTraversalPolicy
メソッド呼び出しが DefaultFocusManager
の対応するメソッドに渡されます。
javax.swing.JComponent
の変更 isManagingFocus
: このメソッドは廃止されました。 isManagingFocus
は JComponent
のフォーカストラバーサルキーを 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
と同様、JInternalFrame
は java.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()
で置き換えられています。