2015-04-01 2 views
0

Я пытаюсь перенаправить мой вывод в текстовой области (который будет встроен где-то в JFrame, используя следующий фрагмент кодаStdout Перенаправление с Logger

public static void main(String[] args) { 
    Logger.getLogger(MyClass.class.getName()).info("Test"); 

    final JTextArea x = new JTextArea(); 

    PrintStream printStream = new PrintStream(new OutputStream(){ 
     @Override 
     public void write(int b) throws IOException { 
      x.append(String.valueOf((char)b)); 
       x.setCaretPosition(x.getDocument().getLength()); 
     } 
    }); 

    System.setOut(printStream); 
    System.setErr(printStream); 

    Logger.getLogger(MyClass.class.getName()).info("Test again"); 
    System.out.println("Another test"); 

    JOptionPane.showMessageDialog(null, x.getText()); 
} 

Однако при выполнении последней линии, JOptionPane текст был только «Другой тест». Когда я удалить первый Logger линию

Logger.getLogger(MyClass.class.getName()).info("Test"); 

Тогда все перенаправлены на JTextArea. Я подозреваю, что после того, как я вхожу «Test» в первой строке, класс Logger связывает на консольный выход и не будет giv даже если stdout перенаправляется на TextArea.

+1

Возможно, что getLogger сохраняет «PrintStream», связанный с 'System.out', и сохраняет ссылку на него. Отсюда ваш результат. – fge

ответ

1

Первая линия вашего основного метода captures the current System.err stream. Если вы перенастроете потоки перед созданием обработчиков корневого регистратора, это сработает. Вы также можете изменить код для создания нового ConsoleHandler и добавить его в корневой регистратор после переназначения потока ошибок. Следите за тем, чтобы нарушить EDT rules of Swing с вашей текущей реализацией.

Смежные вопросы