Module java.desktop
Package java.awt

Class KeyboardFocusManager

java.lang.Object
java.awt.KeyboardFocusManager
所有已实现的接口:
KeyEventDispatcher, KeyEventPostProcessor
直接已知的子类:
DefaultKeyboardFocusManager

public abstract class KeyboardFocusManager extends Object implements KeyEventDispatcher, KeyEventPostProcessor
键盘焦点管理器负责管理活动和焦点窗口,以及当前焦点所有者。焦点所有者被定义为应用程序中通常接收用户生成的所有KeyEvents的组件。焦点窗口是焦点所有者所在的窗口。只有Frame或Dialog可以是活动窗口。本地窗口系统可能用特殊装饰(例如突出显示的标题栏)表示活动窗口或其子窗口。活动窗口始终是焦点窗口或焦点窗口的第一个Frame或Dialog的所有者。

键盘焦点管理器既是客户端代码查询焦点所有者和启动焦点更改的集中位置,也是所有与焦点相关的FocusEvents、与焦点相关的WindowEvents和KeyEvents的事件分发器。

某些浏览器将不同代码库中的小程序分隔到不同的上下文中,并在这些上下文之间建立隔离墙。在这种情况下,每个上下文将有一个键盘焦点管理器。其他浏览器将所有小程序放入同一个上下文中,这意味着所有小程序将只有一个全局键盘焦点管理器。这种行为取决于实现。有关更多信息,请参阅浏览器的文档。无论可能存在多少上下文,每个类加载器永远不会有多个焦点所有者、焦点窗口或活动窗口。

请参阅如何使用焦点子系统,这是《Java教程》中的一个部分,以及焦点规范以获取更多信息。

自 JDK 版本:
1.4
另请参见:
  • Field Details

  • Constructor Details

    • KeyboardFocusManager

      public KeyboardFocusManager()
      初始化KeyboardFocusManager。
  • Method Details

    • getCurrentKeyboardFocusManager

      public static KeyboardFocusManager getCurrentKeyboardFocusManager()
      返回调用线程上下文中当前的KeyboardFocusManager实例。
      返回:
      此线程上下文的KeyboardFocusManager
      参见:
    • setCurrentKeyboardFocusManager

      public static void setCurrentKeyboardFocusManager(KeyboardFocusManager newManager) throws SecurityException
      设置调用线程上下文中当前的KeyboardFocusManager实例。如果指定为null,则当前的KeyboardFocusManager将被替换为DefaultKeyboardFocusManager的新实例。

      如果安装了SecurityManager,则调用线程必须被授予AWTPermission "replaceKeyboardFocusManager"权限,以替换当前的KeyboardFocusManager。如果未授予此权限,此方法将抛出SecurityException,并且当前的KeyboardFocusManager将保持不变。

      参数:
      newManager - 此线程上下文的新KeyboardFocusManager
      抛出:
      SecurityException - 如果调用线程没有权限替换当前的KeyboardFocusManager
      参见:
    • getFocusOwner

      public Component getFocusOwner()
      返回焦点所有者,如果焦点所有者在调用线程的上下文中。焦点所有者被定义为应用程序中将通常接收用户生成的所有KeyEvents的组件。如果为焦点所有者启用了焦点遍历键,则映射到焦点所有者的焦点遍历键的KeyEvents将不会传递。此外,KeyEventDispatchers可能会在到达焦点所有者之前重新定向或消耗KeyEvents。
      返回:
      焦点所有者,如果焦点所有者不是调用线程的上下文的成员,则为null
      参见:
    • getGlobalFocusOwner

      protected Component getGlobalFocusOwner() throws SecurityException
      返回焦点所有者,即使调用线程与焦点所有者不在同一上下文中。焦点所有者被定义为应用程序中将通常接收用户生成的所有KeyEvents的组件。如果为焦点所有者启用了焦点遍历键,则映射到焦点所有者的焦点遍历键的KeyEvents将不会传递。此外,KeyEventDispatchers可能会在到达焦点所有者之前重新定向或消耗KeyEvents。

      如果此KeyboardFocusManager不是调用线程上下文的当前KeyboardFocusManager,则此方法将抛出SecurityException。

      返回:
      焦点所有者
      抛出:
      SecurityException - 如果此KeyboardFocusManager不是调用线程上下文的当前KeyboardFocusManager,并且调用线程没有"replaceKeyboardFocusManager"权限
      参见:
    • setGlobalFocusOwner

      protected void setGlobalFocusOwner(Component focusOwner) throws SecurityException
      设置焦点所有者。如果组件不可聚焦,则操作将被取消。焦点所有者被定义为应用程序中将通常接收用户生成的所有KeyEvents的组件。如果为焦点所有者启用了焦点遍历键,则映射到焦点所有者的焦点遍历键的KeyEvents将不会传递。此外,KeyEventDispatchers可能会在到达焦点所有者之前重新定向或消耗KeyEvents。

      此方法实际上不会将焦点设置到指定的组件。它仅存储要由getFocusOwner()随后返回的值。使用Component.requestFocus()Component.requestFocusInWindow()来更改焦点所有者,受平台限制。

      参数:
      focusOwner - 焦点所有者
      抛出:
      SecurityException - 如果此KeyboardFocusManager不是调用线程上下文的当前KeyboardFocusManager,并且调用线程没有"replaceKeyboardFocusManager"权限
      参见:
    • clearFocusOwner

      public void clearFocusOwner()
      如果焦点所有者存在并且位于调用线程的上下文中,则在Java和本机级别清除焦点所有者,否则方法将静默返回。

      焦点所有者组件将接收永久的FOCUS_LOST事件。完成此操作后,本机窗口系统将丢弃所有用户生成的KeyEvents,直到用户选择新的组件来接收焦点,或通过调用requestFocus()显式地给组件焦点。此操作不会更改焦点或活动窗口。

      自:
      1.8
      参见:
    • clearGlobalFocusOwner

      public void clearGlobalFocusOwner() throws SecurityException
      在Java和本机级别清除全局焦点所有者。如果存在焦点所有者,则该组件将接收永久的FOCUS_LOST事件。完成此操作后,本机窗口系统将丢弃所有用户生成的KeyEvents,直到用户选择新的组件来接收焦点,或通过调用requestFocus()显式地给组件焦点。此操作不会更改焦点或活动窗口。

      如果安装了SecurityManager,则调用线程必须被授予"replaceKeyboardFocusManager" AWTPermission。如果未授予此权限,此方法将抛出SecurityException,并且当前焦点所有者将不会被清除。

      此方法仅供设置为调用线程上下文的当前KeyboardFocusManager的KeyboardFocusManager使用。不适用于一般客户端使用。

      抛出:
      SecurityException - 如果调用线程没有"replaceKeyboardFocusManager"权限
      参见:
    • getPermanentFocusOwner

      public Component getPermanentFocusOwner()
      返回永久焦点所有者,如果永久焦点所有者在调用线程的上下文中。永久焦点所有者被定义为应用程序中接收永久FOCUS_GAINED事件的最后一个组件。焦点所有者和永久焦点所有者是等效的,除非当前存在临时焦点更改。在这种情况下,当临时焦点更改结束时,永久焦点所有者将再次成为焦点所有者。
      返回:
      永久焦点所有者,如果永久焦点所有者不是调用线程的上下文的成员,则为null
      参见:
    • getGlobalPermanentFocusOwner

      protected Component getGlobalPermanentFocusOwner() throws SecurityException
      返回永久焦点所有者,即使调用线程与永久焦点所有者处于不同上下文中。永久焦点所有者被定义为应用程序中接收永久FOCUS_GAINED事件的最后一个组件。焦点所有者和永久焦点所有者是等效的,除非当前正在生效临时焦点更改。在这种情况下,当临时焦点更改结束时,永久焦点所有者将再次成为焦点所有者。
      返回:
      永久焦点所有者
      抛出:
      SecurityException - 如果此KeyboardFocusManager不是调用线程上下文的当前KeyboardFocusManager,并且调用线程没有"replaceKeyboardFocusManager"权限
      参见:
    • setGlobalPermanentFocusOwner

      protected void setGlobalPermanentFocusOwner(Component permanentFocusOwner) throws SecurityException
      设置永久焦点所有者。如果组件不可聚焦,则操作将被取消。永久焦点所有者被定义为应用程序中接收永久FOCUS_GAINED事件的最后一个组件。焦点所有者和永久焦点所有者是等效的,除非当前正在生效临时焦点更改。在这种情况下,当临时焦点更改结束时,永久焦点所有者将再次成为焦点所有者。

      此方法实际上不会将焦点设置到指定的组件。它只是存储要由getPermanentFocusOwner()随后返回的值。使用Component.requestFocus()Component.requestFocusInWindow()来更改焦点所有者,受平台限制。

      参数:
      permanentFocusOwner - 永久焦点所有者
      抛出:
      SecurityException - 如果此KeyboardFocusManager不是调用线程上下文的当前KeyboardFocusManager,并且调用线程没有"replaceKeyboardFocusManager"权限
      参见:
    • getFocusedWindow

      public Window getFocusedWindow()
      返回焦点的窗口,如果焦点的窗口与调用线程处于相同上下文中。焦点的窗口是焦点所有者所在的窗口。
      返回:
      焦点的窗口,如果焦点的窗口不是调用线程上下文的成员,则返回null
      参见:
    • getGlobalFocusedWindow

      protected Window getGlobalFocusedWindow() throws SecurityException
      返回焦点的窗口,即使调用线程与焦点的窗口处于不同上下文中。焦点的窗口是焦点所有者所在的窗口。
      返回:
      焦点的窗口
      抛出:
      SecurityException - 如果此KeyboardFocusManager不是调用线程上下文的当前KeyboardFocusManager,并且调用线程没有"replaceKeyboardFocusManager"权限
      参见:
    • setGlobalFocusedWindow

      protected void setGlobalFocusedWindow(Window focusedWindow) throws SecurityException
      设置焦点的窗口。焦点的窗口是焦点所有者所在的窗口。如果要聚焦的窗口不是可聚焦窗口,则操作将被取消。

      此方法实际上不会根据本机窗口系统更改焦点的窗口。它只是存储要由getFocusedWindow()随后返回的值。使用Component.requestFocus()Component.requestFocusInWindow()来更改焦点的窗口,受平台限制。

      参数:
      focusedWindow - 焦点的窗口
      抛出:
      SecurityException - 如果此KeyboardFocusManager不是调用线程上下文的当前KeyboardFocusManager,并且调用线程没有"replaceKeyboardFocusManager"权限
      参见:
    • getActiveWindow

      public Window getActiveWindow()
      返回活动窗口,如果活动窗口与调用线程处于相同上下文中。只有Frame或Dialog可以是活动窗口。本机窗口系统可能使用特殊装饰来表示活动窗口或其子窗口,例如突出显示的标题栏。活动窗口始终是焦点窗口,或者是焦点窗口的第一个Frame或Dialog的所有者。
      返回:
      活动窗口,如果活动窗口不是调用线程上下文的成员,则返回null
      参见:
    • getGlobalActiveWindow

      protected Window getGlobalActiveWindow() throws SecurityException
      返回活动窗口,即使调用线程与活动窗口处于不同上下文中。只有Frame或Dialog可以是活动窗口。本机窗口系统可能使用特殊装饰来表示活动窗口或其子窗口,例如突出显示的标题栏。活动窗口始终是焦点窗口,或者是焦点窗口的第一个Frame或Dialog的所有者。
      返回:
      活动窗口
      抛出:
      SecurityException - 如果此KeyboardFocusManager不是调用线程上下文的当前KeyboardFocusManager,并且调用线程没有"replaceKeyboardFocusManager"权限
      参见:
    • setGlobalActiveWindow

      protected void setGlobalActiveWindow(Window activeWindow) throws SecurityException
      设置活动窗口。只有Frame或Dialog可以是活动窗口。本机窗口系统可能使用特殊装饰来表示活动窗口或其子窗口,例如突出显示的标题栏。活动窗口始终是焦点窗口,或者是焦点窗口的第一个Frame或Dialog的所有者。

      此方法实际上不会根据本机窗口系统更改活动窗口。它只是存储要由getActiveWindow()随后返回的值。使用Component.requestFocus()Component.requestFocusInWindow()来更改活动窗口,受平台限制。

      参数:
      activeWindow - 活动窗口
      抛出:
      SecurityException - 如果此KeyboardFocusManager不是调用线程上下文的当前KeyboardFocusManager,并且调用线程没有"replaceKeyboardFocusManager"权限
      参见:
    • getDefaultFocusTraversalPolicy

      public FocusTraversalPolicy getDefaultFocusTraversalPolicy()
      返回默认的焦点遍历策略。顶层组件在创建时使用此值来通过显式调用Container.setFocusTraversalPolicy初始化自己的焦点遍历策略。
      返回:
      默认的焦点遍历策略。永远不会返回null。
      参见:
    • setDefaultFocusTraversalPolicy

      public void setDefaultFocusTraversalPolicy(FocusTraversalPolicy defaultPolicy)
      设置默认的焦点遍历策略。顶层组件在创建时使用此值来通过显式调用Container.setFocusTraversalPolicy初始化自己的焦点遍历策略。注意:此调用不会影响已创建的组件,因为它们已经初始化了自己的策略。只有新组件将使用此策略作为它们的默认策略。
      参数:
      defaultPolicy - 新的默认焦点遍历策略
      抛出:
      IllegalArgumentException - 如果defaultPolicy为null
      参见:
    • setDefaultFocusTraversalKeys

      public void setDefaultFocusTraversalKeys(int id, Set<? extends AWTKeyStroke> keystrokes)
      设置给定遍历操作的默认焦点遍历键。这个遍历键Set将在所有没有明确定义自己的SetWindow上生效。这个Set也将被任何没有明确定义自己的SetWindows的子Component递归继承。

      默认焦点遍历键的默认值取决于实现。Sun建议特定本机平台的所有实现使用相同的默认值。Windows和Unix的建议如下。这些建议在Sun AWT实现中使用。

      推荐的焦点遍历键的默认值
      标识符 含义 默认值
      KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS 正常向前键盘遍历 TABKEY_PRESSED上,CTRL-TABKEY_PRESSED
      KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS 正常向后键盘遍历 SHIFT-TABKEY_PRESSED上,CTRL-SHIFT-TABKEY_PRESSED
      KeyboardFocusManager.UP_CYCLE_TRAVERSAL_KEYS 向上一个焦点遍历周期
      KeyboardFocusManager.DOWN_CYCLE_TRAVERSAL_KEYS 向下一个焦点遍历周期
      要禁用遍历键,请使用一个空的Set;推荐使用Collections.EMPTY_SET

      使用AWTKeyStroke API,客户端代码可以指定焦点遍历操作将在哪两个特定的KeyEvent中发生,KEY_PRESSEDKEY_RELEASED。然而,无论指定哪个KeyEvent,与焦点遍历键相关的所有KeyEvent,包括关联的KEY_TYPED事件,都将被消耗,并且不会被分派给任何Component。指定KEY_TYPED事件映射到焦点遍历操作,或将同一事件映射到多个默认焦点遍历操作都是运行时错误。

      如果keystrokes中的任何Object不是AWTKeyStroke,此方法可能会抛出ClassCastException

      参数:
      id - KeyboardFocusManager.FORWARD_TRAVERSAL_KEYSKeyboardFocusManager.BACKWARD_TRAVERSAL_KEYSKeyboardFocusManager.UP_CYCLE_TRAVERSAL_KEYSKeyboardFocusManager.DOWN_CYCLE_TRAVERSAL_KEYS之一
      keystrokes - 指定操作的AWTKeyStrokeSet
      抛出:
      IllegalArgumentException - 如果id不是KeyboardFocusManager.FORWARD_TRAVERSAL_KEYSKeyboardFocusManager.BACKWARD_TRAVERSAL_KEYSKeyboardFocusManager.UP_CYCLE_TRAVERSAL_KEYSKeyboardFocusManager.DOWN_CYCLE_TRAVERSAL_KEYS之一,或者如果keystrokes为null,或者如果keystrokes包含null,或者如果任何按键表示KEY_TYPED事件,或者如果任何按键已经映射到另一个默认焦点遍历操作
      参见:
    • getDefaultFocusTraversalKeys

      public Set<AWTKeyStroke> getDefaultFocusTraversalKeys(int id)
      返回给定遍历操作的默认焦点遍历键的Set。这个遍历键Set将在所有没有明确定义自己的SetWindows上生效。这个Set也将被任何没有明确定义自己的SetWindows的子Component递归继承。(有关每个操作的完整描述,请参阅setDefaultFocusTraversalKeys。)
      参数:
      id - KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS、KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS、KeyboardFocusManager.UP_CYCLE_TRAVERSAL_KEYS或KeyboardFocusManager.DOWN_CYCLE_TRAVERSAL_KEYS之一
      返回:
      指定操作的AWTKeyStrokeSet;这个Set将是不可修改的,可能为空;永远不会返回null
      抛出:
      IllegalArgumentException - 如果id不是KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS、KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS、KeyboardFocusManager.UP_CYCLE_TRAVERSAL_KEYS或KeyboardFocusManager.DOWN_CYCLE_TRAVERSAL_KEYS之一
      参见:
    • getCurrentFocusCycleRoot

      public Container getCurrentFocusCycleRoot()
      返回当前焦点循环根,如果当前焦点循环根与调用线程的上下文相同。如果焦点所有者本身是焦点循环根,则在正常焦点遍历期间区分下一个和上一个要聚焦的组件可能会产生歧义。在这种情况下,当前焦点循环根用于区分可能性。

      此方法仅供KeyboardFocusManagers和焦点实现使用。不适用于一般客户端使用。

      返回:
      当前焦点循环根,如果当前焦点循环根不是调用线程的上下文的成员,则为null
      参见:
    • getGlobalCurrentFocusCycleRoot

      protected Container getGlobalCurrentFocusCycleRoot() throws SecurityException
      返回当前焦点循环根,即使调用线程与当前焦点循环根不在同一上下文中。如果焦点所有者本身是焦点循环根,则在正常焦点遍历期间区分下一个和上一个要聚焦的组件可能会产生歧义。在这种情况下,当前焦点循环根用于区分可能性。
      返回:
      当前焦点循环根,如果当前焦点循环根不是调用线程的上下文的成员,则为null
      抛出:
      SecurityException - 如果此KeyboardFocusManager不是调用线程上下文的当前KeyboardFocusManager,并且调用线程没有"replaceKeyboardFocusManager"权限
      参见:
    • setGlobalCurrentFocusCycleRoot

      public void setGlobalCurrentFocusCycleRoot(Container newFocusCycleRoot) throws SecurityException
      设置当前焦点循环根。如果焦点所有者本身是焦点循环根,则在正常焦点遍历期间区分下一个和上一个要聚焦的组件可能会产生歧义。在这种情况下,当前焦点循环根用于区分可能性。

      如果安装了SecurityManager,则调用线程必须被授予"replaceKeyboardFocusManager" AWTPermission。如果未授予此权限,此方法将抛出SecurityException,并且当前焦点循环根将不会更改。

      此方法仅供KeyboardFocusManagers和焦点实现使用。不适用于一般客户端使用。

      参数:
      newFocusCycleRoot - 新的焦点循环根
      抛出:
      SecurityException - 如果调用线程没有"replaceKeyboardFocusManager"权限
      参见:
    • addPropertyChangeListener

      public void addPropertyChangeListener(PropertyChangeListener listener)
      向监听器列表添加一个PropertyChangeListener。该监听器为此类的所有绑定属性注册,包括以下内容:
      • 键盘焦点管理器当前是否正在管理此应用程序或小程序的浏览器上下文的焦点("managingFocus")
      • 焦点所有者("focusOwner")
      • 永久焦点所有者("permanentFocusOwner")
      • 焦点的Window("focusedWindow")
      • 活动Window("activeWindow")
      • 默认焦点遍历策略("defaultFocusTraversalPolicy")
      • 默认FORWARD_TRAVERSAL_KEYSSet("forwardDefaultFocusTraversalKeys")
      • 默认BACKWARD_TRAVERSAL_KEYSSet("backwardDefaultFocusTraversalKeys")
      • 默认UP_CYCLE_TRAVERSAL_KEYSSet("upCycleDefaultFocusTraversalKeys")
      • 默认DOWN_CYCLE_TRAVERSAL_KEYSSet("downCycleDefaultFocusTraversalKeys")
      • 当前焦点循环根("currentFocusCycleRoot")
      如果监听器为null,则不会抛出异常,也不会执行任何操作。
      参数:
      listener - 要添加的PropertyChangeListener
      参见:
    • removePropertyChangeListener

      public void removePropertyChangeListener(PropertyChangeListener listener)
      从监听器列表中移除一个PropertyChangeListener。应该使用此方法来移除为该类的所有绑定属性注册的PropertyChangeListeners。

      如果listener为null,则不会抛出异常,也不执行任何操作。

      参数:
      listener - 要移除的PropertyChangeListener
      另请参阅:
    • getPropertyChangeListeners

      public PropertyChangeListener[] getPropertyChangeListeners()
      返回在此键盘焦点管理器上注册的所有属性更改监听器的数组。
      返回:
      所有此键盘焦点管理器的PropertyChangeListener,如果当前没有注册任何属性更改监听器,则返回空数组
      自版本:
      1.4
      另请参阅:
    • addPropertyChangeListener

      public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener)
      向监听器列表中为特定属性添加一个PropertyChangeListener。指定的属性可以是用户定义的,也可以是以下之一:
      • 键盘焦点管理器当前是否正在管理此应用程序或小程序的浏览器上下文的焦点("managingFocus")
      • 焦点所有者("focusOwner")
      • 永久焦点所有者("permanentFocusOwner")
      • 焦点窗口("focusedWindow")
      • 活动窗口("activeWindow")
      • 默认焦点遍历策略("defaultFocusTraversalPolicy")
      • 默认前向遍历键集合("forwardDefaultFocusTraversalKeys")
      • 默认后向遍历键集合("backwardDefaultFocusTraversalKeys")
      • 默认上循环遍历键集合("upCycleDefaultFocusTraversalKeys")
      • 默认下循环遍历键集合("downCycleDefaultFocusTraversalKeys")
      • 当前焦点循环根("currentFocusCycleRoot")
      如果listener为null,则不会抛出异常,也不执行任何操作。
      参数:
      propertyName - 上述属性名称之一
      listener - 要添加的PropertyChangeListener
      另请参阅:
    • removePropertyChangeListener

      public void removePropertyChangeListener(String propertyName, PropertyChangeListener listener)
      从特定属性的监听器列表中移除一个PropertyChangeListener。应该使用此方法来移除为特定绑定属性注册的PropertyChangeListeners。

      如果listener为null,则不会抛出异常,也不执行任何操作。

      参数:
      propertyName - 有效的属性名称
      listener - 要移除的PropertyChangeListener
      另请参阅:
    • getPropertyChangeListeners

      public PropertyChangeListener[] getPropertyChangeListeners(String propertyName)
      返回与指定属性关联的所有PropertyChangeListener的数组。
      参数:
      propertyName - 属性名称
      返回:
      与指定属性关联的所有PropertyChangeListener,如果尚未添加此类监听器,则返回空数组。
      自版本:
      1.4
      另请参阅:
    • firePropertyChange

      protected void firePropertyChange(String propertyName, Object oldValue, Object newValue)
      响应绑定属性更改而触发PropertyChangeEvent。事件将传递给所有注册的PropertyChangeListeners。如果oldValue和newValue相同,则不会传递事件。
      参数:
      propertyName - 已更改的属性名称
      oldValue - 属性的先前值
      newValue - 属性的新值
    • addVetoableChangeListener

      public void addVetoableChangeListener(VetoableChangeListener listener)
      向监听器列表中添加一个VetoableChangeListener。该监听器将注册为此类的所有可否决属性,包括以下内容:
      • 焦点所有者("focusOwner")
      • 永久焦点所有者("permanentFocusOwner")
      • 焦点窗口("focusedWindow")
      • 活动窗口("activeWindow")
      如果listener为null,则不会抛出异常,也不执行任何操作。
      参数:
      listener - 要添加的VetoableChangeListener
      另请参阅:
    • removeVetoableChangeListener

      public void removeVetoableChangeListener(VetoableChangeListener listener)
      从特定属性的监听器列表中移除一个VetoableChangeListener。应该使用此方法来移除为该类的所有可否决属性注册的VetoableChangeListeners。

      如果listener为null,则不会抛出异常,也不执行任何操作。

      参数:
      listener - 要移除的VetoableChangeListener
      另请参阅:
    • getVetoableChangeListeners

      public VetoableChangeListener[] getVetoableChangeListeners()
      返回在此键盘焦点管理器上注册的所有可否决更改监听器的数组。
      返回:
      所有此键盘焦点管理器的VetoableChangeListener,如果当前没有注册任何可否决更改监听器,则返回空数组
      自版本:
      1.4
      另请参阅:
    • addVetoableChangeListener

      public void addVetoableChangeListener(String propertyName, VetoableChangeListener listener)
      向监听器列表中为特定属性添加一个VetoableChangeListener。指定的属性可以是用户定义的,也可以是以下之一:
      • 焦点所有者("focusOwner")
      • 永久焦点所有者("permanentFocusOwner")
      • 焦点窗口("focusedWindow")
      • 活动窗口("activeWindow")
      如果listener为null,则不会抛出异常,也不执行任何操作。
      参数:
      propertyName - 上述属性名称之一
      listener - 要添加的VetoableChangeListener
      另请参阅:
    • removeVetoableChangeListener

      public void removeVetoableChangeListener(String propertyName, VetoableChangeListener listener)
      从特定属性的监听器列表中移除一个VetoableChangeListener。应该使用此方法来移除为特定绑定属性注册的VetoableChangeListeners。

      如果listener为null,则不会抛出异常,也不执行任何操作。

      参数:
      propertyName - 有效的属性名称
      listener - 要移除的VetoableChangeListener
      另请参阅:
    • getVetoableChangeListeners

      public VetoableChangeListener[] getVetoableChangeListeners(String propertyName)
      返回与指定属性关联的所有VetoableChangeListener的数组。
      参数:
      propertyName - 属性名称
      返回:
      与指定属性关联的所有VetoableChangeListener,如果没有添加此类监听器,则返回一个空数组。
      自版本:
      1.4
      参见:
    • fireVetoableChange

      protected void fireVetoableChange(String propertyName, Object oldValue, Object newValue) throws PropertyVetoException
      在响应可否否决属性更改时触发PropertyChangeEvent。事件将传递给所有已注册的VetoableChangeListeners。如果VetoableChangeListener抛出PropertyVetoException,则会触发一个新事件,将所有VetoableChangeListeners恢复为旧值,然后重新抛出异常。如果oldValue和newValue相同,则不会传递事件。
      参数:
      propertyName - 已更改的属性名称
      oldValue - 属性的先前值
      newValue - 属性的新值
      抛出:
      PropertyVetoException - 如果VetoableChangeListener抛出PropertyVetoException
    • addKeyEventDispatcher

      public void addKeyEventDispatcher(KeyEventDispatcher dispatcher)
      将KeyEventDispatcher添加到此KeyboardFocusManager的调度器链中。此KeyboardFocusManager将请求每个KeyEventDispatcher在最终调度KeyEvent本身之前调度用户生成的KeyEvents。KeyEventDispatchers将按照它们添加的顺序通知。一旦一个KeyEventDispatcher从其dispatchKeyEvent方法返回true,通知将停止。可以添加的KeyEventDispatchers总数没有限制,也没有特定的KeyEventDispatcher实例可以添加的次数限制。

      如果指定了空调度器,则不会执行任何操作,也不会抛出异常。

      在多线程应用程序中,KeyEventDispatcher的行为与其他AWT监听器相同。有关更多详细信息,请参阅AWT线程问题

      参数:
      dispatcher - 要添加到调度器链中的KeyEventDispatcher
      参见:
    • removeKeyEventDispatcher

      public void removeKeyEventDispatcher(KeyEventDispatcher dispatcher)
      从此KeyboardFocusManager的调度器链中删除先前添加的KeyEventDispatcher。除非通过调用addKeyEventDispatcher显式重新注册,否则无法完全删除此KeyboardFocusManager本身。

      如果指定了空调度器,如果指定的调度器不在调度器链中,或者如果未显式重新注册此KeyboardFocusManager,则不会执行任何操作,也不会抛出异常。

      在多线程应用程序中,KeyEventDispatcher的行为与其他AWT监听器相同。有关更多详细信息,请参阅AWT线程问题

      参数:
      dispatcher - 要从调度器链中删除的KeyEventDispatcher
      参见:
    • getKeyEventDispatchers

      protected List<KeyEventDispatcher> getKeyEventDispatchers()
      返回此KeyboardFocusManager的KeyEventDispatcher链作为List。该List不会包括此KeyboardFocusManager,除非通过调用addKeyEventDispatcher显式重新注册。如果没有注册其他KeyEventDispatchers,实现可以自由返回null或长度为0的List。客户端代码不应假定一种行为优于另一种,也不应假定一旦建立,行为就不会改变。
      返回:
      可能为null或空的KeyEventDispatchers列表
      参见:
    • addKeyEventPostProcessor

      public void addKeyEventPostProcessor(KeyEventPostProcessor processor)
      将KeyEventPostProcessor添加到此KeyboardFocusManager的后处理器链中。在KeyEvent被分派到其目标并由其处理后,KeyboardFocusManager将请求每个KeyEventPostProcessor作为KeyEvent最终解析的一部分执行任何必要的后处理。KeyEventPostProcessors将按照它们添加的顺序通知;当前KeyboardFocusManager将最后通知。一旦一个KeyEventPostProcessor从其postProcessKeyEvent方法返回true,通知将停止。可以添加的KeyEventPostProcessors总数没有限制,也没有特定的KeyEventPostProcessor实例可以添加的次数限制。

      如果指定了空后处理器,则不会执行任何操作,也不会抛出异常。

      在多线程应用程序中,KeyEventPostProcessor的行为与其他AWT监听器相同。有关更多详细信息,请参阅AWT线程问题

      参数:
      processor - 要添加到后处理器链中的KeyEventPostProcessor
      参见:
    • removeKeyEventPostProcessor

      public void removeKeyEventPostProcessor(KeyEventPostProcessor processor)
      从此KeyboardFocusManager的后处理器链中删除先前添加的KeyEventPostProcessor。此KeyboardFocusManager本身无法完全删除。只能删除通过addKeyEventPostProcessor添加的其他引用。

      如果指定了空后处理器,如果指定的后处理器不在后处理器链中,或者如果未显式添加此KeyboardFocusManager,则不会执行任何操作,也不会抛出异常。

      在多线程应用程序中,KeyEventPostProcessor的行为与其他AWT监听器相同。有关更多详细信息,请参阅AWT线程问题

      参数:
      processor - 要从后处理器链中删除的KeyEventPostProcessor
      参见:
    • getKeyEventPostProcessors

      protected List<KeyEventPostProcessor> getKeyEventPostProcessors()
      返回此KeyboardFocusManager的KeyEventPostProcessor链作为List。该List不会包括此KeyboardFocusManager,除非通过调用addKeyEventPostProcessor显式添加。如果未注册任何KeyEventPostProcessors,实现可以自由返回null或长度为0的List。客户端代码不应假定一种行为优于另一种,也不应假定一旦建立,行为就不会改变。
      返回:
      可能为null或空的KeyEventPostProcessors列表
      参见:
    • dispatchEvent

      public abstract boolean dispatchEvent(AWTEvent e)
      AWT事件分派程序调用此方法,请求当前KeyboardFocusManager代表其调度指定事件。预期所有KeyboardFocusManagers将基于KeyboardFocusManager对焦点所有者、焦点相关的所有WindowEvents以及所有KeyEvents的概念,有时覆盖指定AWTEvent的源,分派所有FocusEvents、与焦点相关的所有WindowEvents以及所有KeyEvents。必须使用redispatchEvent进行分派,以防止AWT事件分派程序递归请求KeyboardFocusManager再次分派事件。如果此方法返回false,则AWT事件分派程序将尝试自行分派事件。
      参数:
      e - 要分派的AWTEvent
      返回:
      如果此方法分派了事件,则返回true;否则返回false
      参见:
    • redispatchEvent

      public final void redispatchEvent(Component target, AWTEvent e)
      以一种使AWT事件分派程序不会递归请求KeyboardFocusManager或任何已安装的KeyEventDispatchers再次分派事件的方式重新分派AWTEvent。dispatchEvent的客户端实现和客户端定义的KeyEventDispatchers必须调用redispatchEvent(target, e)而不是target.dispatchEvent(e)来分派事件。

      此方法仅供KeyboardFocusManagers和KeyEventDispatchers使用。不适用于一般客户端使用。

      参数:
      target - 应将事件分派到的组件
      e - 要分派的事件
      参见:
    • dispatchKeyEvent

      public abstract boolean dispatchKeyEvent(KeyEvent e)
      通常情况下,如果在调度器链中没有其他KeyEventDispatcher分派了KeyEvent,或者没有其他KeyEventDispatchers被注册,那么将调用此方法。如果此方法的实现返回falsedispatchEvent可能会尝试自行分派KeyEvent,或者可能只是返回false。如果返回truedispatchEvent也应该返回true
      指定者:
      dispatchKeyEvent 在接口 KeyEventDispatcher
      参数:
      e - 当前KeyboardFocusManager请求此KeyEventDispatcher分派的KeyEvent
      返回:
      如果分派了KeyEvent,则返回true;否则返回false
      参见:
    • postProcessKeyEvent

      public abstract boolean postProcessKeyEvent(KeyEvent e)
      此方法将由dispatchKeyEvent调用。默认情况下,此方法将处理任何未消耗的KeyEvent,将其映射到AWT MenuShortcut,并消耗事件并激活快捷方式。
      指定者:
      postProcessKeyEvent 在接口 KeyEventPostProcessor
      参数:
      e - 要后处理的KeyEvent
      返回:
      返回true表示不会通知其他KeyEventPostProcessor处理该KeyEvent。
      参见:
    • processKeyEvent

      public abstract void processKeyEvent(Component focusedComponent, KeyEvent e)
      如果KeyEvent表示指定focusedComponent的焦点遍历键,则此方法将启动焦点遍历操作。预期focusedComponent是当前焦点所有者,尽管这不一定是情况。如果不是,则焦点遍历将继续进行,就好像focusedComponent是当前焦点所有者一样。
      参数:
      focusedComponent - 如果指定事件表示Component的焦点遍历键,则将成为焦点遍历操作的基础
      e - 可能表示焦点遍历键的事件
    • enqueueKeyEvents

      protected abstract void enqueueKeyEvents(long after, Component untilFocused)
      AWT调用此方法,通知KeyboardFocusManager应该延迟分派KeyEvents,直到指定的Component成为焦点所有者。如果客户端代码请求焦点更改,并且AWT确定本请求可能由本机窗口系统授予,则AWT将调用此方法。KeyboardFocusManager有责任延迟分派具有晚于指定时间戳的KeyEvents,直到指定Component接收到FOCUS_GAINED事件,或者AWT通过调用dequeueKeyEventsdiscardKeyEvents取消延迟请求。
      参数:
      after - 当前事件的时间戳,或者当前事件没有时间戳,则为当前系统时间,或者AWT无法确定当前正在处理的事件
      untilFocused - 在任何挂起的KeyEvents之前应该接收FOCUS_GAINED事件的Component
      参见:
    • dequeueKeyEvents

      protected abstract void dequeueKeyEvents(long after, Component untilFocused)
      AWT调用此方法,通知KeyboardFocusManager应该取消延迟分派的KeyEvents。由于调用enqueueKeyEvents而排队的所有KeyEvents,具有相同时间戳和Component的请求应该释放以正常分派给当前焦点所有者。如果给定的时间戳小于零,则应取消具有最旧时间戳的给定Component的挂起请求(如果有)。
      参数:
      after - 在调用enqueueKeyEvents时指定的时间戳,或任何值< 0
      untilFocused - 在调用enqueueKeyEvents时指定的Component
      参见:
    • discardKeyEvents

      protected abstract void discardKeyEvents(Component comp)
      AWT调用此方法,通知KeyboardFocusManager应该取消延迟分派的KeyEvents。由于一个或多个调用enqueueKeyEvents而排队的所有KeyEvents,具有相同Component的请求应该被丢弃。
      参数:
      comp - 在一个或多个调用enqueueKeyEvents中指定的Component
      参见:
    • focusNextComponent

      public abstract void focusNextComponent(Component aComponent)
      将焦点设置在aComponent之后的Component上,通常基于FocusTraversalPolicy。
      参数:
      aComponent - 作为焦点遍历操作基础的Component
      参见:
    • focusPreviousComponent

      public abstract void focusPreviousComponent(Component aComponent)
      将焦点设置在aComponent之前的Component上,通常基于FocusTraversalPolicy。
      参数:
      aComponent - 作为焦点遍历操作基础的Component
      参见:
    • upFocusCycle

      public abstract void upFocusCycle(Component aComponent)
      将焦点向上移动一个焦点遍历周期。通常,焦点所有者设置为aComponent的焦点循环根,并且当前焦点循环根设置为新焦点所有者的焦点循环根。但是,如果aComponent的焦点循环根是一个Window,则通常焦点所有者设置为窗口的默认焦点Component,并且当前焦点循环根保持不变。
      参数:
      aComponent - 作为焦点遍历操作基础的Component
    • downFocusCycle

      public abstract void downFocusCycle(Container aContainer)
      将焦点向下移动一个焦点遍历周期。通常,如果aContainer是焦点循环根,则焦点所有者设置为aContainer的默认焦点Component,并且当前焦点循环根设置为aContainer。如果aContainer不是焦点循环根,则不会发生焦点遍历操作。
      参数:
      aContainer - 作为焦点遍历操作基础的Container
    • focusNextComponent

      public final void focusNextComponent()
      将焦点设置在当前焦点所有者之后的Component上。
    • focusPreviousComponent

      public final void focusPreviousComponent()
      将焦点设置在当前焦点所有者之前的Component上。
    • upFocusCycle

      public final void upFocusCycle()
      从当前焦点所有者向上移动一个焦点遍历周期。通常,新焦点所有者设置为当前焦点所有者的焦点循环根,并且当前焦点循环根设置为新焦点所有者的焦点循环根。但是,如果当前焦点所有者的焦点循环根是一个Window,则通常焦点所有者设置为焦点循环根的默认焦点Component,并且当前焦点循环根保持不变。
    • downFocusCycle

      public final void downFocusCycle()
      从当前焦点所有者向下移动一个焦点遍历周期,仅当当前焦点所有者是焦点循环根的Container时。通常,焦点所有者设置为当前焦点所有者的默认焦点Component,并且当前焦点循环根设置为当前焦点所有者。如果当前焦点所有者不是焦点循环根的Container,则不会发生焦点遍历操作。