gpt4 book ai didi

java - 专注于 Java 调试

转载 作者:搜寻专家 更新时间:2023-10-30 21:20:18 25 4
gpt4 key购买 nike

问题:

我正在尝试调试我的 Java Swing 应用程序中一些与焦点相关的问题。有时某些组件似乎正在吸引注意力,而我无法弄清楚代码中发生这种情况的位置。

我尝试过的:

  • VetoableChangeListenerKeyboardFocusManager(用于 focusOwner)。这确实为我提供了有关哪些组件失去和获得焦点的信息,但它无法帮助我确定代码中请求焦点的位置。

  • 自定义 KeyboardFocusManager。但在那方面我也只能在它收到事件时进行干预。到那时,调用 requestFocus 的调用堆栈已经丢失。

  • 自定义 EventQueue。但是我也可以干预再次从 EDT 调用的 dispatchEvent 方法。调用堆栈再次丢失(有趣的是 postEvent(AWTEvent) 未被调用)。

问题:

我正在寻找的是调用 requestFocusInWindow 时的调用堆栈。是否可以获取此信息。也许,如果我可以重新定义用于在 EventQueue 中发布事件的方法,那么我就可以打印堆栈转储。但是 EventQueue.postEvent(AWTEvent) 不会被调用。

谁能提出一个解决方案,帮助我在调用 requestFocusrequestFocusInWIndow 时获取堆栈状态?

最佳答案

我遇到了这个优雅的solution对于您的问题,它不会为您提供调用堆栈,但会告诉您哪个类获得了焦点。

import java.util.logging.ConsoleHandler;
import java.util.logging.Level;
import java.util.logging.Logger;

// ...

private static void enableFocusLogging() {
// Obtain a reference to the logger
Logger focusLog = Logger.getLogger("java.awt.focus.Component");

// The logger should log all messages
focusLog.setLevel(Level.ALL);

// Create a new handler
ConsoleHandler handler = new ConsoleHandler();

// The handler must handle all messages
handler.setLevel(Level.ALL);

// Add the handler to the logger
focusLog.addHandler(handler);
}

或者,您可以通过更改全局 JRE logging.properties(或您的应用程序的自定义 logging.properties 文件)来实现此目的。通过这种方式,您可以在不需要源代码或编译器的情况下跟踪 AWT 焦点事件。下面最后两行是需要添加的内容:

############################################################
# Default Logging Configuration File
#
# You can use a different file by specifying a filename
# with the java.util.logging.config.file system property.
# For example java -Djava.util.logging.config.file=myfile
############################################################
handlers= java.util.logging.ConsoleHandler

# Default global logging level.
# This specifies which kinds of events are logged across
# all loggers. For any given facility this global level
# can be overriden by a facility specific level
.level= INFO

############################################################
# Handler specific properties.
# Describes specific configuration info for Handlers.
############################################################

java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter


############################################################
# Facility specific properties.
# Provides extra control for each logger.
############################################################

# Log AWT Focus Events
java.util.logging.ConsoleHandler.level = FINEST
java.awt.focus.Component.level = FINEST

另一个生成有关焦点事件的有用信息的记录器名为 java.awt.focus.DefaultKeyboardFocusManager

关于java - 专注于 Java 调试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2223346/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com