2015-07-04 4 views
5

Ich muss die Schlüsselereignisverteilung in einer Swing-Anwendung debuggen. Ich dachte folgendes wäre ausreichend:Java Swing-Protokollierung aktivieren (Schlüsselversand)

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) 

Aber nichts passiert. (Die Logger melden, dass sie aktiviert sind, aber ich kann keine Textausgabe sehen). Muss ich irgendwo einen PrintStream konfigurieren, um die Protokollnachrichten zu sehen?

Antwort

5

Wie vorgeschlagen here, bin ich mir nicht sicher, ob sun.util.logging.PlatformLogger geeignet ist. Um Fokus-Ereignisse zu protokollieren, musste ich eine höhere Ebene auf dem Root-Logger angeben, z. Level.ALL. Das Hinzufügen eines ConsoleHandler, wie this, kann das Protokoll leichter lesbar machen.

Console:

 
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,[email protected],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,[email protected],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,[email protected],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 

Code:

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); 
    } 
} 
Verwandte Themen