难以处理 NULL 异常并在 JXBrowser 中更改 HTML
Difficulty handling NULL exceptions and changing HTML within JXBrowser
我最近开始使用 JXBrowser 构建编辑距离的可视化 (Levenshtein)。我正在使用 JXBrowser 将 JAVA 与 HTML、CSS 和 JS 集成。
我的应用程序通过加载我的开始屏幕从 MainFrame class 开始,特别是 hello.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");
}
}
}
然后我调用 UserInput() 并且没有抛出 Null 错误。然后,我使用与上述相同的方法加载我的 UserInputForm class,而不是使用 UserInputForm.html 作为我的视图。
InputStream urlStream = getClass().getResourceAsStream("../web/UserInputForm.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);
final DOMDocument document = browser.getDocument();
final DOMElement documentElement = document.getDocumentElement();
if (documentElement != null) {
DOMElement submitElement = documentElement.findElement(By.id("enterButton"));
if (submitElement != null) {
submitElement.addEventListener(DOMEventType.OnClick, new DOMEventListener() {
public void handleEvent(DOMEvent event) {
DOMElement source = document.findElement(By.id("sourceString"));
DOMElement target = document.findElement(By.id("targetString"));
}}, false);
}
else{
System.out.println("NULL on Sub Form");
}
}
}
问题主要发生在加载UserInputForm 时。我通过 submitElement 文档元素得到一个 NULL returned。有时我在应用程序启动时得到 NULL returned。我觉得在加载这些表格时我缺少一个基本程序。有没有人知道如何确保文档元素不 return NULL?这是我的 HTML 加载技术的问题吗?
Browser.loadHTML()
方法作为加载特定 HTML 的请求异步执行。所以这个方法returns.
时不能保证网页加载完全
在加载的网页上访问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
我最近开始使用 JXBrowser 构建编辑距离的可视化 (Levenshtein)。我正在使用 JXBrowser 将 JAVA 与 HTML、CSS 和 JS 集成。
我的应用程序通过加载我的开始屏幕从 MainFrame class 开始,特别是 hello.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");
}
}
}
然后我调用 UserInput() 并且没有抛出 Null 错误。然后,我使用与上述相同的方法加载我的 UserInputForm class,而不是使用 UserInputForm.html 作为我的视图。
InputStream urlStream = getClass().getResourceAsStream("../web/UserInputForm.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);
final DOMDocument document = browser.getDocument();
final DOMElement documentElement = document.getDocumentElement();
if (documentElement != null) {
DOMElement submitElement = documentElement.findElement(By.id("enterButton"));
if (submitElement != null) {
submitElement.addEventListener(DOMEventType.OnClick, new DOMEventListener() {
public void handleEvent(DOMEvent event) {
DOMElement source = document.findElement(By.id("sourceString"));
DOMElement target = document.findElement(By.id("targetString"));
}}, false);
}
else{
System.out.println("NULL on Sub Form");
}
}
}
问题主要发生在加载UserInputForm 时。我通过 submitElement 文档元素得到一个 NULL returned。有时我在应用程序启动时得到 NULL returned。我觉得在加载这些表格时我缺少一个基本程序。有没有人知道如何确保文档元素不 return NULL?这是我的 HTML 加载技术的问题吗?
Browser.loadHTML()
方法作为加载特定 HTML 的请求异步执行。所以这个方法returns.
在加载的网页上访问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