【问题标题】:JavaFX webview: How to forward System.out and System.err to the Firebug Lite console?JavaFX webview:如何将 System.out 和 System.err 转发到 Firebug Lite 控制台?
【发布时间】:2015-08-31 13:20:08
【问题描述】:

我找到了几个关于如何从 System.out 和 System.err 传输和重定向消息的示例。 决定使用 JavaFX Webview 和 Dukescript 开发应用程序后,我发现在一个地方显示所有消息很有用,即 Firebug Lite 控制台。

见下文。

PS 这和this完全相反

【问题讨论】:

    标签: javafx-webengine firebug-lite dukescript


    【解决方案1】:

    先定义一个抽象类

    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 webview 本身必须管道 console.log 消息首先到 System.out。

    更新

    当消息由浏览器以外的线程生成时,上述解决方案不起作用。这是基于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 来回传递。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-06
      • 1970-01-01
      • 2010-11-06
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多