我最近开始使用JXBrowser来构建编辑距离的可视化(Levenshtein)。我正在使用JXBrowser将JAVA与HTML,CSS和JS集成。
我的应用程序从MainFrame类开始,加载我的开始屏幕,特别是hello.html。
p{
text-align:justify;
-ms-word-break: break-all;
word-break: break-all;
word-break: break-word;
-webkit-hyphens: auto;
-moz-hyphens: auto;
hyphens: auto;
}
然后我调用UserInput()并且不会抛出Null错误。然后,我使用与上面相同的方法加载我的UserInputForm类,而不是使用UserInputForm.html作为我的视图。
public MainFrame() {
final Browser browser = new Browser();
BrowserView view = new BrowserView(browser);
JFrame frame = new JFrame("JxBrowser - EditDistance");
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.add(view, BorderLayout.CENTER);
frame.setSize(500, 400);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
InputStream urlStream = getClass().getResourceAsStream("../web/hello.html");
String html = null;
try (BufferedReader urlReader = new BufferedReader(new InputStreamReader (urlStream))) {
StringBuilder builder = new StringBuilder();
String row;
while ((row = urlReader.readLine()) != null) {
builder.append(row);
}
html = builder.toString();
} catch (IOException e) {
throw new RuntimeException(e);
}
browser.loadHTML(html);
DOMDocument document = browser.getDocument();
final DOMElement documentElement = document.getDocumentElement();
if (documentElement != null) {
try{
DOMElement element = documentElement.findElement(By.id("button"));
element.addEventListener(DOMEventType.OnClick, new DOMEventListener() {
public void handleEvent(DOMEvent event) {
new UserInput();
}
}, false);
}catch(NullPointerException e){
System.out.println("NULLL on Entry");
}
}
}
问题主要发生在UserInputForm加载时。我得到了submitElement文档元素返回的NULL。有时我会在应用程序启动时返回NULL。在加载这些表单时,我觉得我错过了一个基本的过程。有没有人有任何洞察力确保文档元素不会返回NULL?这是我的HTML加载技术的问题吗?
答案 0 :(得分:0)
Browser.loadHTML()
方法作为加载特定HTML的请求异步执行。因此,无法保证在此方法返回时网页已完全加载。
在加载的网页上访问DOM文档之前,必须等到网页完全加载。如果未完全加载网页,则DOM文档或某些DOM元素可能会显示已损坏或丢失。
以下示例代码演示了如何加载HTML并等待它完全加载:
// Blocks current thread execution and waits until the web page is loaded completely
Browser.invokeAndWaitFinishLoadingMainFrame(browser, new Callback<Browser>() {
@Override
public void invoke(Browser value) {
value.loadHTML("<html><body>Your HTML goes here</body></html>");
}
});
注意:使用此方法仅加载网页。
以下文章介绍如何加载网页并等待它完全加载:https://jxbrowser.support.teamdev.com/support/solutions/articles/9000013107-loading-waiting