良い一日、
アプリのカスタムの最小化ボタンと閉じるボタンの動作に一貫性がないという問題があります。このプロジェクトを進めて複雑にする前に、これを修正したいと思います。
バックグラウンド
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 内の " " ラベルにバインドされる場所です。WebView
WebEngine
AppHandle
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);
}
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
クラスで、そのメソッドはonclick
JSP のイベントから呼び出されます。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();
}
質問
実行時に JSObject の「正常性」を評価して、それが原因であるかどうかを確認するにはどうすればよいですか?
AppHandle
JSP と起動時の接続を明示的に切断するものはありますか? オンminimize
? オンshow
?
まったく機能しなかった場合、これは簡単になります。矛盾がどこから来ているのかわかりません。
どんな助けでも大歓迎です、
ありがとうございました。