美好的一天,

我的应用程序的自定义“最小化”和“关闭”按钮工作不一致,出现问题。我想在推进该项目并使之更加复杂之前对其进行修复。



背景

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



问题

这些按钮可以工作,但是工作不一致。同样,只要按钮确实随机失败,它们就会一起失败。

例如。


启动应用程序,按钮不起作用。
启动应用程序,按钮正常工作。最小化应用程序,最大化应用程序-现在按钮不起作用。
启动应用程序,按钮正常工作。最小化和最大化应用一次后,按钮仍然有效。再执行一次或两次-现在按钮不起作用。
等等






JavaFX组件

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


Region类扩展WebView并容纳WebEngine及其AppHandle。这是app类绑定到JSP中的“ AppHandler”标签的地方。

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的相关部分,其中的按钮调用onclick方法AppHandle

<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>


这是onclick类,其方法是从JSP中的print事件调用的。如果将exit()语句放在hide()JSObject类中,则当按钮失败时它们将不会执行。这使我相信AppUtility出现故障。

public class AppHandle {
  private AppUtility utility;

  public AppHandle(AppUtility utility) {
    this.utility = utility;
  }

  public void exit() {
    utility.exit();
  }

  public void hide() {
    utility.hide();
  }
}


Stage方法作用于JavaFX Application以隐藏和关闭JavaFX show/hide/inconified。我原本以为我的AppHandle逻辑可能有问题,但是当按钮失败时,该代码甚至都不会执行。

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的“运行状况”以查看是否是罪魁祸首?
此处是否有任何内容会在启动时明确断开JSP和minimize之间的连接?在show上?在上?


如果根本不起作用,这会更容易,我不确定不一致的根源。

任何帮助,将不胜感激,

谢谢。

最佳答案

ah,我解决了。让这成为我的课程,可以更好地搜索问题。

This question使我明白了这个问题。

我正在AppHandle中本地创建JSObject。我想在某个地方本地AppHandle会被取消引用,并且随之而来的是我的JSP到Java的连接。

现在,在AppHandle中创建AppClient并将其传递到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);
}

07-24 14:30