【问题标题】:Enable Java Swing logging (key dispatch)启用 Java Swing 日志记录(密钥调度)
【发布时间】:2015-07-04 14:13:06
【问题描述】:

我需要在 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 才能查看日志消息吗?

【问题讨论】:

    标签: java swing focus keyevent dispatch


    【解决方案1】:

    正如here 建议的那样,我不确定使用sun.util.logging.PlatformLogger 是否合适。要记录焦点事件,我必须在根记录器上指定更高级别,例如Level.ALL。添加ConsoleHandler,如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:焦点所有者为 null 或 this java.awt.focus.DefaultKeyboardFocusManager:在 {0} 为 {1} 排队 java.awt.focus.Component:传递给 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] 在 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:{0} 上 FOCUS_GAINED 之前的标记 java.awt.focus.DefaultKeyboardFocusManager:>>> 标记转储,时间:{0} java.awt.focus.DefaultKeyboardFocusManager:{0} java.awt.focus.DefaultKeyboardFocusManager:FOCUS_GAINED 之后的标记 java.awt.focus.DefaultKeyboardFocusManager:>>> 标记转储,时间:{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 https://stackoverflow.com/a/31223145/230513
     * @see https://stackoverflow.com/q/20815048/230513
     */
    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);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-16
      • 1970-01-01
      • 2019-09-08
      • 2013-10-22
      • 2011-06-17
      相关资源
      最近更新 更多