2015-02-24 31 views
10

Bir uygulama geliştirmek için JavaFX WebEngine içindeki JavaFX ve Javascript motorunu kullanıyorum. Hata ayıklama amacıyla javascript'ten geri bildirim almak istiyorum. WebEngine içindeki konsol çıkışına ne olur? Erişebildiğim herhangi bir yol var mı, yoksa java'da System.out'a mı yönlendiriliyorsunuz?JavaFX 8 WebEngine: javascript'ten javada System.out'a console.log() nasıl alınır?

import netscape.javascript.JSObject; 

public class JavaBridge 
{ 
    public void log(String text) 
    { 
     System.out.println(text); 
    } 
} 

[...] 

webEngine.getLoadWorker().stateProperty().addListener((observable, oldValue, newValue) -> 
{ 
    JSObject window = (JSObject) webEngine.executeScript("window"); 
    JavaBridge bridge = new JavaBridge(); 
    window.setMember("java", bridge); 
    webEngine.executeScript("console.log = function(message)\n" + 
     "{\n" + 
     " java.log(message);\n" + 
     "};"); 
}); 

cevap

17

Aşağıdaki kod console.log()JavaBridge.log() yönlendirir. Biz Log4j yüzden böyle bir javascript sarmalayıcı yarattı aşağıdakileri kullanın:

module.exports = { 

    levels:[ "ALL", "TRACE", "DEBUG", "INFO", "WARN", "ERROR", "OFF"], 

    level:"INFO", 

    error:function(msg){ 
     if(this.isErrorEnabled()){ 
     console.error(msg) 
     } 
    }, 
    warn:function(msg){ 
     if(this.isWarnEnabled()){ 
     console.warn(msg) 
     } 
    }, 
    info:function(msg){ 
     if(this.isInfoEnabled()){ 
     console.log("INFO: "+msg) 
     } 
    }, 
    debug:function(msg){ 
     if(this.isDebugEnabled()){ 
     console.log("DEBUG: "+msg) 
     } 
    }, 
    trace:function(msg){ 
     if(this.isTraceEnabled()){ 
     console.log("TRACE: "+msg) 
     } 
    }, 

    isErrorEnabled:function(){ 
     return this.isEnabled("ERROR"); 
    }, 
    isWarnEnabled:function(){ 
     return this.isEnabled("WARN"); 
    }, 
    isInfoEnabled:function(){ 
     return this.isEnabled("INFO"); 
    }, 
    isDebugEnabled:function(){ 
     return this.isEnabled("DEBUG"); 
    }, 
    isTraceEnabled:function(){ 
     return this.isEnabled("TRACE"); 
    }, 
    isEnabled:function(statementLevel){ 
     return this.levels.indexOf(this.level)<=this.levels.indexOf(statementLevel); 
    } 
    } 

Sonra javascript başında ben günlüğü mevcut olup olmadığını görmek için kontrol edin ve ayarlayın:

if(window.log == undefined){ 
    window.log = require("./utils/log4j-wrapper") 
    window.log.level = "INFO" 
} 

Ve bu şekilde

WebEngine webEngine = webView.getEngine() 
JSObject win = (JSObject) webEngine.executeScript("window") 
win.setMember("log", log) //log being the java log4j logger 

Bu şekilde ben giriş alabilirsiniz ben doğrudan tarayıcıda açıyorum eğer yoksa bir Web'den çalıştırılıyor: doğrudan motorda Log4J logger ayarlarsanız hatta gibi url yüklemek önce Bir JavaFX programında görüntüle. Ve WebView denetleyicisinin paketlerinizle eşleşen javascript'te günlüğe kaydetme düzeylerine sahip olmanın ek yararı vardır. Daha büyük javascript görünümleri için sadece bir alternatif.

+0

, teşekkür için console.log gibi fonksiyonların yeniden tanımlanması ile js köprü enjekte etmek zorunda değilsiniz! –

+0

Burada "pencere" nedir? – NaveenBharadwaj

+0

@Florian yardım edebilir misiniz? JSObject – NaveenBharadwaj

4

Ben diğer yöne gitmek ister:

0

Ayrıca ileti dinleyiciyi de ekleyebilirsiniz, çıktılarınızda neler olduğunu görebilirsiniz. Sen her yüklenen sayfa gerçekten awsome var

WebConsoleListener.setDefaultListener((webView, message, lineNumber, sourceId) -> { 
    System.out.println(message + "[at " + lineNumber + "]"); 
}); 
+0

Evet, ancak konsol yöntemlerine iletilen argümanları genişletip görüntüleyebilme veya hata ayıklayıcı konsoldan aldığınız gibi kaynamaya geçme yeteneğiniz yoktur. – vladsch

+0

Sadece konsol.log'dan çıktı almayı sordu, bu yüzden Green Man'ın cevabına daha iyi bir alternatif. Özel hata ayıklama araçları başka bir vakayla ilişkilendirilir ve her zaman yardımcı olmaz - örneğin son dağıtılmış uygulamamızda çıktı yakalamak istiyorsak. – dzikoysk