- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试调试我的 Java Swing 应用程序中一些与焦点相关的问题。有时某些组件似乎正在吸引注意力,而我无法弄清楚代码中发生这种情况的位置。
VetoableChangeListener
和 KeyboardFocusManager
(用于 focusOwner
)。这确实为我提供了有关哪些组件失去和获得焦点的信息,但它无法帮助我确定代码中请求焦点的位置。
自定义 KeyboardFocusManager
。但在那方面我也只能在它收到事件时进行干预。到那时,调用 requestFocus
的调用堆栈已经丢失。
自定义 EventQueue
。但是我也可以干预再次从 EDT 调用的 dispatchEvent
方法。调用堆栈再次丢失(有趣的是 postEvent(AWTEvent)
未被调用)。
我正在寻找的是调用 requestFocusInWindow
时的调用堆栈。是否可以获取此信息。也许,如果我可以重新定义用于在 EventQueue
中发布事件的方法,那么我就可以打印堆栈转储。但是 EventQueue.postEvent(AWTEvent)
不会被调用。
谁能提出一个解决方案,帮助我在调用 requestFocus
或 requestFocusInWIndow
时获取堆栈状态?
最佳答案
我遇到了这个优雅的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/
我有一个 Collection View 并以这样一种方式排列它,即在屏幕的一侧有一个单独的列,并且根据焦点中的集合项替换内容。 如果对某个项目的关注超过 0.5 秒,我希望能够换出内容。 这是我目前
这是一种经常出现的情况,对我来说永远不会太容易。我想我会问其他人如何处理它。 想象一下,如果 demo=60 命令行参数的处理是这样完成的: if DemoOptionSpecified() {
我是一名优秀的程序员,十分优秀!