启用 Java Swing 日志记录(密钥调度)
Enable Java Swing logging (key dispatch)
我需要在 Swing 应用程序中调试按键事件调度。我认为以下内容就足够了:
val eventLog = PlatformLogger.getLogger("java.awt.event.Component")
eventLog.setLevel(PlatformLogger.Level.ALL)
val focusLog = PlatformLogger.getLogger("java.awt.focus.DefaultKeyboardFocusManager")
focusLog.setLevel(PlatformLogger.Level.ALL)
但是没有任何反应。 (记录器报告它们已启用,但我看不到任何文本输出)。我需要在某处配置 PrintStream
才能查看日志消息吗?
按照建议here, I'm not sure that using sun.util.logging.PlatformLogger
is appropriate. To log focus events, I had to specify a higher level on the root logger, e.g. Level.ALL
. Adding a ConsoleHandler
, like this,可能会使日志更易于阅读。
控制台:
java.awt.focus.DefaultKeyboardFocusManager: sun.awt.TimedWindowEvent[WINDOW_GAINED_FOCUS,opposite=null,oldState=0,newState=0] on frame0
java.awt.focus.DefaultKeyboardFocusManager: java.awt.event.WindowEvent[WINDOW_ACTIVATED,opposite=null,oldState=0,newState=0] on frame0
java.awt.focus.DefaultKeyboardFocusManager: tempLost {0}, toFocus {1}
java.awt.focus.Component: focus owner is null or this
java.awt.focus.DefaultKeyboardFocusManager: Enqueue at {0} for {1}
java.awt.focus.Component: Pass for javax.swing.JButton[,0,0,97x29,alignmentX=0.0,alignmentY=0.5,border=com.apple.laf.AquaButtonBorder$Dynamic@56e325b9,flags=288,maximumSize=,minimumSize=,preferredSize=,defaultIcon=,disabledIcon=,disabledSelectedIcon=,margin=javax.swing.plaf.InsetsUIResource[top=0,left=2,bottom=0,right=2],paintBorder=true,paintFocus=true,pressedIcon=,rolloverEnabled=false,rolloverIcon=,rolloverSelectedIcon=,selectedIcon=,text=Button 1,defaultCapable=true]
java.awt.focus.DefaultKeyboardFocusManager: java.awt.event.WindowEvent[WINDOW_OPENED,opposite=null,oldState=0,newState=0] on frame0
java.awt.focus.DefaultKeyboardFocusManager: sun.awt.TimedWindowEvent[WINDOW_GAINED_FOCUS,opposite=javax.swing.JFrame[frame0,752,469,97x80,layout=java.awt.BorderLayout,title=LoggerTest,resizable,normal,defaultCloseOperation=EXIT_ON_CLOSE,rootPane=javax.swing.JRootPane[,0,22,97x58,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=],rootPaneCheckingEnabled=true],oldState=0,newState=0] on frame0
java.awt.focus.DefaultKeyboardFocusManager: java.awt.FocusEvent[FOCUS_GAINED,permanent,opposite=null,cause=ACTIVATION] on javax.swing.JButton[,0,0,97x29,alignmentX=0.0,alignmentY=0.5,border=com.apple.laf.AquaButtonBorder$Dynamic@56e325b9,flags=288,maximumSize=,minimumSize=,preferredSize=,defaultIcon=,disabledIcon=,disabledSelectedIcon=,margin=javax.swing.plaf.InsetsUIResource[top=0,left=2,bottom=0,right=2],paintBorder=true,paintFocus=true,pressedIcon=,rolloverEnabled=false,rolloverIcon=,rolloverSelectedIcon=,selectedIcon=,text=Button 1,defaultCapable=true]
java.awt.focus.DefaultKeyboardFocusManager: Markers before FOCUS_GAINED on {0}
java.awt.focus.DefaultKeyboardFocusManager: >>> Markers dump, time: {0}
java.awt.focus.DefaultKeyboardFocusManager: {0}
java.awt.focus.DefaultKeyboardFocusManager: Markers after FOCUS_GAINED
java.awt.focus.DefaultKeyboardFocusManager: >>> Markers dump, time: {0}
java.awt.focus.Component: java.awt.FocusEvent[FOCUS_GAINED,permanent,opposite=null,cause=ACTIVATION] on javax.swing.JButton[,0,0,97x29,alignmentX=0.0,alignmentY=0.5,border=com.apple.laf.AquaButtonBorder$Dynamic@56e325b9,flags=288,maximumSize=,minimumSize=,preferredSize=,defaultIcon=,disabledIcon=,disabledSelectedIcon=,margin=javax.swing.plaf.InsetsUIResource[top=0,left=2,bottom=0,right=2],paintBorder=true,paintFocus=true,pressedIcon=,rolloverEnabled=false,rolloverIcon=,rolloverSelectedIcon=,selectedIcon=,text=Button 1,defaultCapable=true]
java.awt.focus.DefaultKeyboardFocusManager: java.awt.event.WindowEvent[WINDOW_CLOSING,opposite=null,oldState=0,newState=0] on frame0
代码:
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.util.logging.ConsoleHandler;
import java.util.logging.Formatter;
import java.util.logging.Level;
import java.util.logging.LogRecord;
import java.util.logging.Logger;
import javax.swing.JButton;
import javax.swing.JFrame;
/**
* @see
* @see
*/
public class LoggerTest {
private void display() {
JFrame f = new JFrame("LoggerTest");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setLayout(new GridLayout(0, 1));
f.add(new JButton("Button 1"));
f.add(new JButton("Button 2"));
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
public static void main(String[] args) {
Logger rootLogger = Logger.getLogger("");
rootLogger.setLevel(Level.ALL);
logClass("java.awt.focus.Component");
logClass("java.awt.focus.DefaultKeyboardFocusManager");
EventQueue.invokeLater(new LoggerTest()::display);
}
private static void logClass(String name) {
ConsoleHandler consoleHandler = new ConsoleHandler();
consoleHandler.setLevel(Level.ALL);
consoleHandler.setFormatter(new Formatter() {
@Override
public String format(LogRecord record) {
return name + ": " + record.getMessage() + '\n';
}
});
Logger logger = Logger.getLogger(name);
logger.setLevel(Level.ALL);
logger.addHandler(consoleHandler);
}
}
我需要在 Swing 应用程序中调试按键事件调度。我认为以下内容就足够了:
val eventLog = PlatformLogger.getLogger("java.awt.event.Component")
eventLog.setLevel(PlatformLogger.Level.ALL)
val focusLog = PlatformLogger.getLogger("java.awt.focus.DefaultKeyboardFocusManager")
focusLog.setLevel(PlatformLogger.Level.ALL)
但是没有任何反应。 (记录器报告它们已启用,但我看不到任何文本输出)。我需要在某处配置 PrintStream
才能查看日志消息吗?
按照建议here, I'm not sure that using sun.util.logging.PlatformLogger
is appropriate. To log focus events, I had to specify a higher level on the root logger, e.g. Level.ALL
. Adding a ConsoleHandler
, like this,可能会使日志更易于阅读。
控制台:
java.awt.focus.DefaultKeyboardFocusManager: sun.awt.TimedWindowEvent[WINDOW_GAINED_FOCUS,opposite=null,oldState=0,newState=0] on frame0 java.awt.focus.DefaultKeyboardFocusManager: java.awt.event.WindowEvent[WINDOW_ACTIVATED,opposite=null,oldState=0,newState=0] on frame0 java.awt.focus.DefaultKeyboardFocusManager: tempLost {0}, toFocus {1} java.awt.focus.Component: focus owner is null or this java.awt.focus.DefaultKeyboardFocusManager: Enqueue at {0} for {1} java.awt.focus.Component: Pass for javax.swing.JButton[,0,0,97x29,alignmentX=0.0,alignmentY=0.5,border=com.apple.laf.AquaButtonBorder$Dynamic@56e325b9,flags=288,maximumSize=,minimumSize=,preferredSize=,defaultIcon=,disabledIcon=,disabledSelectedIcon=,margin=javax.swing.plaf.InsetsUIResource[top=0,left=2,bottom=0,right=2],paintBorder=true,paintFocus=true,pressedIcon=,rolloverEnabled=false,rolloverIcon=,rolloverSelectedIcon=,selectedIcon=,text=Button 1,defaultCapable=true] java.awt.focus.DefaultKeyboardFocusManager: java.awt.event.WindowEvent[WINDOW_OPENED,opposite=null,oldState=0,newState=0] on frame0 java.awt.focus.DefaultKeyboardFocusManager: sun.awt.TimedWindowEvent[WINDOW_GAINED_FOCUS,opposite=javax.swing.JFrame[frame0,752,469,97x80,layout=java.awt.BorderLayout,title=LoggerTest,resizable,normal,defaultCloseOperation=EXIT_ON_CLOSE,rootPane=javax.swing.JRootPane[,0,22,97x58,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=],rootPaneCheckingEnabled=true],oldState=0,newState=0] on frame0 java.awt.focus.DefaultKeyboardFocusManager: java.awt.FocusEvent[FOCUS_GAINED,permanent,opposite=null,cause=ACTIVATION] on javax.swing.JButton[,0,0,97x29,alignmentX=0.0,alignmentY=0.5,border=com.apple.laf.AquaButtonBorder$Dynamic@56e325b9,flags=288,maximumSize=,minimumSize=,preferredSize=,defaultIcon=,disabledIcon=,disabledSelectedIcon=,margin=javax.swing.plaf.InsetsUIResource[top=0,left=2,bottom=0,right=2],paintBorder=true,paintFocus=true,pressedIcon=,rolloverEnabled=false,rolloverIcon=,rolloverSelectedIcon=,selectedIcon=,text=Button 1,defaultCapable=true] java.awt.focus.DefaultKeyboardFocusManager: Markers before FOCUS_GAINED on {0} java.awt.focus.DefaultKeyboardFocusManager: >>> Markers dump, time: {0} java.awt.focus.DefaultKeyboardFocusManager: {0} java.awt.focus.DefaultKeyboardFocusManager: Markers after FOCUS_GAINED java.awt.focus.DefaultKeyboardFocusManager: >>> Markers dump, time: {0} java.awt.focus.Component: java.awt.FocusEvent[FOCUS_GAINED,permanent,opposite=null,cause=ACTIVATION] on javax.swing.JButton[,0,0,97x29,alignmentX=0.0,alignmentY=0.5,border=com.apple.laf.AquaButtonBorder$Dynamic@56e325b9,flags=288,maximumSize=,minimumSize=,preferredSize=,defaultIcon=,disabledIcon=,disabledSelectedIcon=,margin=javax.swing.plaf.InsetsUIResource[top=0,left=2,bottom=0,right=2],paintBorder=true,paintFocus=true,pressedIcon=,rolloverEnabled=false,rolloverIcon=,rolloverSelectedIcon=,selectedIcon=,text=Button 1,defaultCapable=true] java.awt.focus.DefaultKeyboardFocusManager: java.awt.event.WindowEvent[WINDOW_CLOSING,opposite=null,oldState=0,newState=0] on frame0
代码:
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.util.logging.ConsoleHandler;
import java.util.logging.Formatter;
import java.util.logging.Level;
import java.util.logging.LogRecord;
import java.util.logging.Logger;
import javax.swing.JButton;
import javax.swing.JFrame;
/**
* @see
* @see
*/
public class LoggerTest {
private void display() {
JFrame f = new JFrame("LoggerTest");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setLayout(new GridLayout(0, 1));
f.add(new JButton("Button 1"));
f.add(new JButton("Button 2"));
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
public static void main(String[] args) {
Logger rootLogger = Logger.getLogger("");
rootLogger.setLevel(Level.ALL);
logClass("java.awt.focus.Component");
logClass("java.awt.focus.DefaultKeyboardFocusManager");
EventQueue.invokeLater(new LoggerTest()::display);
}
private static void logClass(String name) {
ConsoleHandler consoleHandler = new ConsoleHandler();
consoleHandler.setLevel(Level.ALL);
consoleHandler.setFormatter(new Formatter() {
@Override
public String format(LogRecord record) {
return name + ": " + record.getMessage() + '\n';
}
});
Logger logger = Logger.getLogger(name);
logger.setLevel(Level.ALL);
logger.addHandler(consoleHandler);
}
}