gpt4 book ai didi

javascript - (JavaFX WebEngine) JavaScript 到 Java 调用工作不一致

转载 作者:行者123 更新时间:2023-11-28 17:43:26 25 4
gpt4 key购买 nike

美好的一天,

我的应用程序的自定义最小化和关闭按钮工作不一致存在问题。我想在推进这个项目并使之变得更加复杂之前解决这个问题。

<小时/>

背景

该应用程序是一个未修饰的 JavaFX 阶段,其中包含一个 WebView,该 WebView 加载由嵌入式 Tomcat 服务器托管的 JSP。 最小化关闭按钮是JSP中的HTML,并具有onclick监听器,这些监听器调用Java方法以通过JavaScript-to最小化和关闭应用程序-Java 接口(interface)类 AppHandle 和委托(delegate)类 AppUtility

<小时/>

问题

按钮可以工作,但工作不一致。此外,每当按钮随机失效时,它们就会一起失效。

例如

  • 启动应用程序,按钮不起作用。
  • 启动应用程序,按钮起作用。最小化应用程序,最大化应用程序 - 现在按钮不起作用。
  • 启动应用程序,按钮起作用。最小化和最大化应用程序一次,按钮仍然有效。再执行一两次 - 现在按钮不起作用。
  • 等等
<小时/>

代码

JavaFX 组件

Stage
|
\-- StackPane
|
\-- Browser (contains the WebView/WebEngine)

Browser 类扩展了 Region 并容纳 WebView 及其 WebEngine。这是 AppHandle 类绑定(bind)到 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 类,它的方法是从JSP 中的onclick 事件调用的。如果我将 print 语句放入 exit()hide() 类中,则当按钮失败时它们将不会执行。这让我相信 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();
}
<小时/>

问题

  1. 如何在运行时评估 JSObject 的“健康状况”,看看它是否是罪魁祸首?

  2. 这里是否有任何东西会在启动时显式中断 JSP 和 AppHandle 之间的连接?关于最小化显示

如果它根本不起作用,这会更容易,我不确定不一致的地方来自哪里。

如有任何帮助,我们将不胜感激,

谢谢。

最佳答案

呸,我解决了。让这成为我更好地寻找问题的一个教训。

This question引导我解决了这个问题。

我正在 JSObject 中本地创建 AppHandle。我猜想在某个时候本地 AppHandle 会被解除引用,并且随之而来的是我的 JSP 到 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);
}

关于javascript - (JavaFX WebEngine) JavaScript 到 Java 调用工作不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47382775/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com