Сначала определим абстрактный класс
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.