6

そのため、ここでも、完全に Swing を使用していた既存の Java アプリケーションを JavaFX を使用するように変換しています。ただし、アプリケーションは JavaFX を完全に使用するわけではありません。これにより、アラート/ダイアログとモダリティに問題が発生しているようです。現在、Java 8u40 を使用しています。

主なアプリケーションは、基本的にメニューを持つ JFrame にあります。メイン コンテンツ ペインは JDesktopPane であり、MenuItem をクリックすると、DeskopPane 内に新しい JInternalFrames が開きます。JavaFX に変換している画面は、現時点では基本的に JInternalFrame 内の JFXPanels です。JFXPanels から開かれた Alerts/Dialogs は、パネル自体に対してはモーダルですが、JInternalFrame、DeskopPane、Menu などに対してはモーダルではありません。

私は DialogPane のドキュメントを読んで、JavaFX の将来のリリースでいくつかの軽量ダイアログと、場合によっては InternalFrames を導入することを計画しているので、この機能についてはもう少し待つ必要があるかもしれません。しかし、理想的には、新しいアラート/ダイアログを開くときは、アプリケーション全体に対してモーダルになります。

編集:現在、モーダルダイアログに対して次のことを行っています:

((Stage)getDialogPane().getScene().getWindow()).setAlwaysOnTop(true);

これにより、ダイアログは常に最前面に表示されますが、メイン アプリケーションが最小化されている場合でも、ダイアログは他のアプリケーションよりも前面に表示されたままになります。また、フレーム内の Swing コンポーネントへの入力もブロックしません。

4

3 に答える 3

1

私はあなたの質問を完全には理解していないと思います。しかし、ここに私の推測があります - あなたはモーダルになるいくつかの警告ウィンドウを作成しようとしていますJFXPanel(つまり、ユーザーはその警告ウィンドウを閉じるまでアプリケーションをクリックすることができません) 部分的にスイングコンポーネントを使用して書かれたアプリケーション全体に.

アプリケーションが純粋に JavaFX で記述される場合は、次のようにします ( のどこかにボタンを作成したと仮定しますJFXPanel) 。

button.setOnAction(evt -> {
    Alert alert = new Alert(Alert.AlertType.INFORMATION);
    alert.initModality(Modality.APPLICATION_MODAL);

    // This will not work in your code
    alert.initOwner(button.getScene().getWindow());

    alert.show();
});

ただし、swing コンポーネントを渡すオブジェクトがinitOwner必要なため、コードでは機能しません。javafx.stage.windowJava 8u40の時点で、Alertオブジェクトの所有権をswingコンポーネントに設定する正しい方法(つまり、ハックではない)はないと思います。当然のことながら、そのような質問はすでにここで尋ねられており、これを書いている時点では回答されていません.

JOptionPane.showMessageDialog要件に応じて、方法とその外観を回避策として使用できます。

button.setOnAction(evt -> {
    JOptionPane.showMessageDialog(desktopPane,"My message");
});

これらのダイアログ ボックスは既定でモーダルなので、作業は必要ありません。これらは、JavaFX コンポーネントの任意のイベント ハンドラー メソッドから呼び出すことができます。

于 2015-09-08T13:39:48.470 に答える