2015-06-15 11 views
0

Я нашел несколько примеров того, как передавать и перенаправлять сообщения из System.out и System.err. Решив разработать приложение с использованием JavaFX Webview и Dukescript, я нашел полезным место для отображения всех сообщений, то есть консоли Firebug Lite.Веб-просмотр JavaFX: как переслать System.out и System.err на консоль Firebug Lite?

См. Ниже.

PS Это полная противоположность, как this

ответ

0

Сначала определим абстрактный класс

public abstract class FirebugConsole extends OutputStream { 

    abstract void log(String msg); 

    StringBuilder sb = new StringBuilder(); 

    @Override 
    public void write(int i) { 
    sb.append((char)i); 
    } 

    @Override 
    public void flush() { 
    if(sb.length() >0 && !sb.toString().equals("\r\n")) 
     log(sb.toString()); 
    sb = new StringBuilder(); 
    } 
} 

расширять его методы, которые реализуют собственные вызовов в JavaScript. Вот, например, как писать сообщения журнала

public class FirebugConsoleInfo extends FirebugConsole{ 
    @net.java.html.js.JavaScriptBody(args = { "msg" }, body = "" 
     + "Firebug.Console.log(msg);") 
    public native void log(String msg); 
} 

Наконец, труба System.out и System.err к этим объектам

public static void onPageLoad() throws Exception { 
    ... 
     System.setOut(new PrintStream(new FirebugConsoleInfo(), true)); 
     System.setErr(new PrintStream(new FirebugConsoleError(), true)); 
    ... 
    } 

Примечание: по некоторым причинам обычный console.log() не работает для меня, Я знаю, что Firebug не связывает консоль, если объект консоли уже присутствует, поэтому я подозреваю, что веб-просмотр WebFX сам должен сам передать сообщения console.log в System.out.

Update

Решение выше не работает, когда генерируются сообщения нитью, отличной от браузера. Вот обновленный решение, основанное на BrwsrCtx.execute()

public abstract static class FirebugConsole extends OutputStream { 
    protected final BrwsrCtx ctx; 

    public FirebugConsole(BrwsrCtx ctx){ 
     this.ctx = ctx; 
    } 
    abstract void logNative(String msg); 

    void log(String msg) { 
     ctx.execute(new Runnable(){ 
     @Override 
     public void run() { 
      logNative(msg); 
     } 
     }); 
    } 

    StringBuilder sb = new StringBuilder(); 

    @Override 
    public void write(int i) { 
     sb.append((char)i); 
    } 

    @Override 
    public void flush() { 
     if(sb.length() >0 && !sb.toString().equals("\r\n")) 
     log(sb.toString()); 
     sb = new StringBuilder(); 
    } 
    } 

    public static class FirebugConsoleInfo extends FirebugConsole{ 
    public FirebugConsoleInfo(BrwsrCtx ctx) { 
     super(ctx); 
    } 

    @net.java.html.js.JavaScriptBody(args = { "msg" }, body = "" 
     + "Firebug.Console.log(msg);") 
    public native void logNative(String msg); 

    } 

    public static class FirebugConsoleError extends FirebugConsole{ 
    public FirebugConsoleError(BrwsrCtx ctx) { 
     super(ctx); 
    } 

    @net.java.html.js.JavaScriptBody(args = { "msg" }, body = "" 
     + "Firebug.Console.error(msg);") 
    public native void logNative(String msg); 
    } 
} 

и

public static void onPageLoad() throws Exception { 
     BrwsrCtx ctx = BrwsrCtx.findDefault(GoGPS_Fx.class); 
     System.setOut(new PrintStream(new FirebugConsoleInfo(ctx), true)); 
     System.setErr(new PrintStream(new FirebugConsoleError(ctx), true)); 
    } 

Примечание: это довольно медленно для больших бревен, может быть быстрее альтернатив (StringWriter это один). Но я подозреваю, что узким местом является передача сообщений с Java на JavaScript.