フォーカス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, 2020, Oracle and/or its affiliates. All rights reserved.