(JavaFX WebEngine) JavaScript-to-Java 调用工作不一致
(JavaFX WebEngine) JavaScript-to-Java Calls Work Inconsistently
美好的一天,
我的应用程序的自定义最小化和关闭按钮工作不一致时遇到问题。我想在推进这个项目并使其变得更复杂之前解决这个问题。
背景
该应用程序是一个未修饰的 JavaFX 阶段,其中包含一个 WebView
,可加载由嵌入式 Tomcat 服务器托管的 JSP。 minimize 和 close 按钮在 JSP 中 HTML 并且有 onclick
个调用 Java 方法通过 JavaScript-to-Java 接口 class、AppHandle
和委托-class、AppUtility
.
问题
按钮可以工作,但工作不一致。此外,每当按钮随机失效时,它们就会一起失效。
例如
- 启动应用程序,按钮不起作用。
- 启动应用程序,按钮工作。最小化应用程序,最大化应用程序 - 现在按钮不起作用。
- 启动应用程序,按钮工作。将应用程序最小化和最大化一次,按钮仍然有效。再做一两次 - 现在按钮不起作用。
- 等等
代码
JavaFX 组件
Stage
|
\-- StackPane
|
\-- Browser (contains the WebView/WebEngine)
Browser
class 扩展了 Region
并容纳了 WebView
及其 WebEngine
。这是 AppHandle
class 绑定到 JSP.
中的“app
”标签的地方
public Browser(String page, final AppUtility utility) {
browser.setFontSmoothingType(FontSmoothingType.GRAY);
browser.setContextMenuEnabled(false);
webEngine.getLoadWorker().stateProperty()
.addListener(
new ChangeListener<State>() {
@Override
public void changed(ObservableValue<? extends State> ov,
State oldState, State newState) {
if (newState == State.SUCCEEDED) {
JSObject win = (JSObject) webEngine.executeScript("window");
win.setMember("app", new AppHandle(utility));
}
}
}
);
webEngine.load(page);
getChildren().add(browser);
}
这是 JSP 的相关部分,其中按钮调用 AppHandler
方法 onclick
。
<div class="container-app">
<div class="text-title">myApp</div>
<div class="icon utility minimize" onclick="app.hide()">
<i class="fa fa-window-minimize" aria-hidden="true"></i>
</div>
<div class="icon utility close" onclick="app.exit()">
<i class="fa fa-times" aria-hidden="true"></i>
</div>
</div>
这是AppHandle
class,它的方法是从JSP中的onclick
事件中调用的。如果我将 print
语句放在 exit()
和 hide()
class 中,它们将不会在按钮失效时执行。这让我相信 JSObject
.
出现了问题
public class AppHandle {
private AppUtility utility;
public AppHandle(AppUtility utility) {
this.utility = utility;
}
public void exit() {
utility.exit();
}
public void hide() {
utility.hide();
}
}
AppUtility
方法作用于 JavaFX Stage
以隐藏和关闭 JavaFX Application
。我最初认为我的 show/hide/inconified
逻辑可能有问题,但当按钮失败时,这段代码甚至没有执行。
public void exit() {
if (SystemTray.isSupported())
SystemTray.getSystemTray().remove(app.getTrayIcon());
Platform.exit();
System.exit(0);
}
public void hide() {
if (SystemTray.isSupported()) {
try {
SystemTray.getSystemTray().add(app.getTrayIcon());
displayIconDialogue();
} catch (AWTException e) {
e.printStackTrace();
}
}
app.getWindow().setIconified(true);
app.getWindow().hide();
}
public void show() {
if (SystemTray.isSupported())
SystemTray.getSystemTray().remove(app.getTrayIcon());
app.getWindow().setIconified(false);
app.getWindow().show();
}
问题
如何在 运行 时间内评估我的 JSObject 的 "health" 以查看它是否是罪魁祸首?
这里有什么会在启动时明确断开 JSP 和 AppHandle
之间的连接吗?在 minimize
上?在 show
?
如果它根本不起作用,这会更容易,我不确定不一致的来源。
如有任何帮助,我们将不胜感激,
谢谢。
呸,我解决了。让这成为我更好地搜索问题的一个教训。
帮我解决了这个问题。
我正在 JSObject
中本地创建 AppHandle
。我想在某些时候本地 AppHandle
被取消引用,我的 JSP-to-Java 连接也随之消失。
我现在在 AppClient
中制作 AppHandle
并将其传递到 Browser
。这样,应用程序会保留对句柄的引用。 Browser
构造函数更改为以下内容:
public Browser(String page, AppHandle handle) {
browser.setFontSmoothingType(FontSmoothingType.GRAY);
browser.setContextMenuEnabled(false);
webEngine.getLoadWorker().stateProperty()
.addListener(
new ChangeListener<State>() {
@Override
public void changed(ObservableValue<? extends State> ov,
State oldState, State newState) {
if (newState == State.SUCCEEDED) {
JSObject win = (JSObject) webEngine.executeScript("window");
win.setMember("app", handle);
}
}
}
);
webEngine.load(page);
getChildren().add(browser);
}
美好的一天,
我的应用程序的自定义最小化和关闭按钮工作不一致时遇到问题。我想在推进这个项目并使其变得更复杂之前解决这个问题。
背景
该应用程序是一个未修饰的 JavaFX 阶段,其中包含一个 WebView
,可加载由嵌入式 Tomcat 服务器托管的 JSP。 minimize 和 close 按钮在 JSP 中 HTML 并且有 onclick
个调用 Java 方法通过 JavaScript-to-Java 接口 class、AppHandle
和委托-class、AppUtility
.
问题
按钮可以工作,但工作不一致。此外,每当按钮随机失效时,它们就会一起失效。
例如
- 启动应用程序,按钮不起作用。
- 启动应用程序,按钮工作。最小化应用程序,最大化应用程序 - 现在按钮不起作用。
- 启动应用程序,按钮工作。将应用程序最小化和最大化一次,按钮仍然有效。再做一两次 - 现在按钮不起作用。
- 等等
代码
JavaFX 组件
Stage
|
\-- StackPane
|
\-- Browser (contains the WebView/WebEngine)
Browser
class 扩展了 Region
并容纳了 WebView
及其 WebEngine
。这是 AppHandle
class 绑定到 JSP.
app
”标签的地方
public Browser(String page, final AppUtility utility) {
browser.setFontSmoothingType(FontSmoothingType.GRAY);
browser.setContextMenuEnabled(false);
webEngine.getLoadWorker().stateProperty()
.addListener(
new ChangeListener<State>() {
@Override
public void changed(ObservableValue<? extends State> ov,
State oldState, State newState) {
if (newState == State.SUCCEEDED) {
JSObject win = (JSObject) webEngine.executeScript("window");
win.setMember("app", new AppHandle(utility));
}
}
}
);
webEngine.load(page);
getChildren().add(browser);
}
这是 JSP 的相关部分,其中按钮调用 AppHandler
方法 onclick
。
<div class="container-app">
<div class="text-title">myApp</div>
<div class="icon utility minimize" onclick="app.hide()">
<i class="fa fa-window-minimize" aria-hidden="true"></i>
</div>
<div class="icon utility close" onclick="app.exit()">
<i class="fa fa-times" aria-hidden="true"></i>
</div>
</div>
这是AppHandle
class,它的方法是从JSP中的onclick
事件中调用的。如果我将 print
语句放在 exit()
和 hide()
class 中,它们将不会在按钮失效时执行。这让我相信 JSObject
.
public class AppHandle {
private AppUtility utility;
public AppHandle(AppUtility utility) {
this.utility = utility;
}
public void exit() {
utility.exit();
}
public void hide() {
utility.hide();
}
}
AppUtility
方法作用于 JavaFX Stage
以隐藏和关闭 JavaFX Application
。我最初认为我的 show/hide/inconified
逻辑可能有问题,但当按钮失败时,这段代码甚至没有执行。
public void exit() {
if (SystemTray.isSupported())
SystemTray.getSystemTray().remove(app.getTrayIcon());
Platform.exit();
System.exit(0);
}
public void hide() {
if (SystemTray.isSupported()) {
try {
SystemTray.getSystemTray().add(app.getTrayIcon());
displayIconDialogue();
} catch (AWTException e) {
e.printStackTrace();
}
}
app.getWindow().setIconified(true);
app.getWindow().hide();
}
public void show() {
if (SystemTray.isSupported())
SystemTray.getSystemTray().remove(app.getTrayIcon());
app.getWindow().setIconified(false);
app.getWindow().show();
}
问题
如何在 运行 时间内评估我的 JSObject 的 "health" 以查看它是否是罪魁祸首?
这里有什么会在启动时明确断开 JSP 和
AppHandle
之间的连接吗?在minimize
上?在show
?
如果它根本不起作用,这会更容易,我不确定不一致的来源。
如有任何帮助,我们将不胜感激,
谢谢。
呸,我解决了。让这成为我更好地搜索问题的一个教训。
我正在 JSObject
中本地创建 AppHandle
。我想在某些时候本地 AppHandle
被取消引用,我的 JSP-to-Java 连接也随之消失。
我现在在 AppClient
中制作 AppHandle
并将其传递到 Browser
。这样,应用程序会保留对句柄的引用。 Browser
构造函数更改为以下内容:
public Browser(String page, AppHandle handle) {
browser.setFontSmoothingType(FontSmoothingType.GRAY);
browser.setContextMenuEnabled(false);
webEngine.getLoadWorker().stateProperty()
.addListener(
new ChangeListener<State>() {
@Override
public void changed(ObservableValue<? extends State> ov,
State oldState, State newState) {
if (newState == State.SUCCEEDED) {
JSObject win = (JSObject) webEngine.executeScript("window");
win.setMember("app", handle);
}
}
}
);
webEngine.load(page);
getChildren().add(browser);
}