JavaFXのでAlertウィンドウのinitModalityを変更することはできません

zjeffer:

JavaFXの(11)で、私は、メインウィンドウの上の警告ウィンドウを表示しようとしているが、私は、メインウィンドウがクリッカブルになりたくありません。これを行うために、私は私が(そのアラートウィンドウのinitModalityを変更しなければならなかったと思っhttps://docs.oracle.com/javafx/2/api/javafx/stage/Stage.html「モダリティ」を参照します)。警告ウィンドウの所有者がnullであるため、それは動作しませんか?

ここに私のコントローラクラスです。メインクラスはただのIntelliJ IDEAと.fxmlファイルによって生成されるデフォルトのJavaFXのメインクラスは、目的をテストするためのボタンでちょうどanchorpaneです。

package sample;

import javafx.scene.control.Alert;
import javafx.scene.control.Button;
import javafx.stage.Modality;

public class Controller {

    public Button button;

    public void initialize(){
        Alert alert = new Alert(Alert.AlertType.ERROR);
        System.out.println(alert.getOwner());             //output: null
        alert.initModality(Modality.APPLICATION_MODAL);
        alert.setHeight(200);
        alert.setWidth(300);
        alert.show();
        button.setOnAction(push -> System.out.println("button pressed")); //button is still pressable
    }
}

initModalityは動作しませんでしたので、メインウィンドウのボタンは、まだ押下可能です。私もでそれを試してみましたModality.WINDOW_MODALし、Modality.NONE変化なし。

それが重要な場合、私はbspwmでLinux上です。

なスロー:

私は、この問題は、Windowsが示されているためであると考えています。以下でこれをテストする(JavaFXの12.0.1を使用して)は、Windows 10上で問題を再現しました:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.stage.Modality;
import javafx.stage.Stage;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) {
        var alert = new Alert(AlertType.INFORMATION);
        alert.initModality(Modality.APPLICATION_MODAL);
        alert.setHeaderText(null);
        alert.setContentText("This is a test of application modality.");
        alert.show();

        primaryStage.setScene(new Scene(new StackPane(new Label("Hello, World!")), 500, 300));
        primaryStage.show();
    }

}

正しくモーダルでないダイアログウィンドウで上記の結果。しかし、あなたが移動する場合alert.show()後に primaryStage.show()すべてが期待どおりに動作します。

あなたが表示されているので、Alert内部をinitialize()FXMLコントローラの方法、それはあなたがあなたの主ウィンドウを表示する前に、コードが実行されている可能性があります。表示したい場合はAlert、アプリケーションの開始時に右を少なくとも2つのオプションがあります。

  1. コールshow()内のPlatform.runLaterあなたがそうであるように、コールあなたの答え

    • これの欠点は、それは一見無関係のコードにあなたのコードは非常に依存させることです。例えば、何らかの理由であれば、あなたはどのように変更して、主ウィンドウが表示されたときに、このオプションを破ることができます。
  2. あなたにメソッドを追加Controllerクラスと、あなたの他のウィンドウを表示した後、それを呼び出します。

    @Override
    public void start(Stage primaryStage) throws IOException {
        FXMLLoader loader = new FXMLLoader(/*location*/);
        primaryStage.setScene(new Scene(loader.load()));
        primaryStage.show();
        loader.<Controller>getController().showMyAwesomeAlert();
    }
    

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=206752&siteId=1