0

良い一日、

アプリのカスタムの最小化ボタンと閉じるボタンの動作に一貫性がないという問題があります。このプロジェクトを進めて複雑にする前に、これを修正したいと思います。


バックグラウンド

WebViewこのアプリは、組み込みの Tomcat サーバーによってホストされる JSP をロードするを含む装飾されていない JavaFX ステージです。最小化ボタンと閉じるボタンは JSP 内の HTML であり、Javaonclickメソッドを呼び出して JavaScript-to-Java インターフェース クラスAppHandleとデリゲートクラス を介してアプリを最小化して閉じるリスナーがありますAppUtility


問題

ボタンは機能しますが、一貫性がありません。また、ボタンがランダムに失敗するときはいつでも、一緒に失敗します。

例えば

  • アプリを起動すると、ボタンが機能しません。
  • アプリを起動すると、ボタンが機能します。アプリを最小化、アプリを最大化 - ボタンが機能しなくなりました。
  • アプリを起動すると、ボタンが機能します。アプリを一度最小化して最大化すると、ボタンは引き続き機能します。もう 1 回か 2 回実行します。ボタンが機能しなくなります。

コード

JavaFX コンポーネント

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

このBrowserクラスは、とその を拡張Regionして収容します。これは、クラスがJSP 内の " " ラベルにバインドされる場所です。WebViewWebEngineAppHandleapp

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);
}

AppHandler以下は、ボタンがメソッドを呼び出す JSP の関連部分です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クラスで、そのメソッドはonclickJSP のイベントから呼び出されます。andクラスに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();
  }
}

メソッドはJavaFX にAppUtility作用して、 JavaFXStageを隠したり閉じたりし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. AppHandleJSP と起動時の接続を明示的に切断するものはありますか? オンminimize? オンshow?

まったく機能しなかった場合、これは簡単になります。矛盾がどこから来ているのかわかりません。

どんな助けでも大歓迎です、

ありがとうございました。

4

1 に答える 1