6

JDialogのalwaysOnTopメソッドを使用するために、JDialogを使用してJFXPanelをラップすることについて読んだことがあります。動作しますが、このハックには小さな問題があります。

この手法を使用してメイン アプリケーション (ポップアップなど) のセカンダリ ウィンドウを作成しているので、それらをメイン ウィンドウの上に設定する必要があります。ラッパー ハックを使用してこれを行うと、トップ パネルはすべて(他のアプリケーションを含む) の 「常に最前面」になります。

セカンダリ画面をアプリケーションの上にのみ配置する方法はありますか? アプリケーションのメイン ウィンドウとセカンダリ ウィンドウの間に別のアプリケーションをドラッグできるのが好きではありません。

4

2 に答える 2

15

JDialogJFXPanelを使用せず、 JavaFX Stagesのみを使用することをお勧めします。

セカンダリ スクリーンを aにして、セカンダリ ステージを表示する前にsecondaryStage.initOwner(primaryStage)Stageを呼び出します。

ステージのドキュメントから:

ステージには、必要に応じて所有者 Window を設定できます。ウィンドウがステージの所有者である場合、それはそのステージの親であると言われます。. . ステージは常にその親ウィンドウの上にあります。

セカンダリ ステージの所有者を設定すると、「アプリケーションの上にのみセカンダリ画面を表示する」という要件が正しく満たされると思います。


更新: コメントからの追加の質問への回答

セカンダリ ウィンドウが開いたら、メイン ステージとのやり取りはしたくありません (再度やり取りできるようにするには、セカンダリ ウィンドウを閉じる必要があります)。

プライマリ ステージへの入力をブロックするには、セカンダリ ステージを表示する前に、secondaryStage.initModality(Modality.WINDOW_MODAL)を呼び出します。

他のアプリケーション ウィンドウへのすべての入力をブロックしたい場合は、 WINDOW_MODALの代わりにAPPLICATION_MODALを使用できます。どちらを使用するかは、必要なユーザー エクスペリエンスによって異なります。

セカンダリ画面をメイン画面の中央に配置するAPIには明らかなものはありません。メイン画面がどこにあっても、常にモニターの中央に表示されます。

質問のこの部分は、ステージの中心の場所の複製です。重複に対する回答には、子ウィンドウの中央揃えを実行するためのサンプル コードがあります。

そうです、パブリック API には、親ウィンドウに対する子ウィンドウの配置に関するものは何もありません。この機能Add helper Methods for Positioning popups relative to nodesの機能リクエストを提出しましたが、この機能リクエストは JavaFX 2.2 の時点ではまだ実装されていません。

子ダイアログの相対的な配置を行うために作成したサンプル プロジェクトがあり、これは役立つかもしれません。

親の中央に配置するには、子を表示する前にステージの位置と幅を照会し、表示するときに子の x 座標と y 座標を適切に設定することをお勧めします。これらはすべて、ウィンドウのxy、およびのプロパティに基づいて実行できます。

JavaFX UI コントロール サンドボックスには、必要な機能の一部を提供するダイアログ プロジェクトもあるため、自分でコーディングする必要はありません。

やがて、あなたが要求しているすべての機能が JavaFX コア プラットフォームに組み込まれることになるでしょう。

于 2013-04-05T20:19:38.317 に答える
3

jewelsea に同意しますが、JDialogおよびJavaFX ステージを使用する必要がある場合(私の場合のように)、primaryStage の親またはモダリティを設定することはできません。

私が見つけた唯一の解決策は、小さな「ハック」を使用することです:

JNA、Java Native Access API を使用して、HWND_TOPMOST パラメーターsetAlwaysOnTop()を使用して独自のメソッドを実行します。User32.INSTANCE.setWindowPos(...)

編集: microsoft doc およびjna docを参照してください

于 2013-08-20T16:53:28.780 に答える