JavaFXでモーダルウィンドウを作成する方法がわかりません。基本的に私はファイルチューザーを持っており、ユーザーがファイルを選択するときに質問したいと思います。ファイルを解析するためにこの情報が必要なので、実行は応答を待つ必要があります。
私はこの質問を見ましたが、この動作を実装する方法を見つけることができませんでした。
私の意見では、親ウィンドウは常にアクティブであるため、これは適切な解決策ではありません。
たとえば、ボタンをクリックした後にモーダルとしてウィンドウを開きたい場合...
private void clickShow(ActionEvent event) {
Stage stage = new Stage();
Parent root = FXMLLoader.load(
YourClassController.class.getResource("YourClass.fxml"));
stage.setScene(new Scene(root));
stage.setTitle("My modal window");
stage.initModality(Modality.WINDOW_MODAL);
stage.initOwner(
((Node)event.getSource()).getScene().getWindow() );
stage.show();
}
これで、新しいウィンドウは本当にモーダルになります-親はブロックです。また、あなたは使用することができます
Modality.APPLICATION_MODAL
これは、JavaFX 2.1のモーダルダイアログ用に以前に作成したソリューションへのリンクです。このソリューションは、現在のステージの上にモーダルステージを作成し、ダイアログコントロールのイベントハンドラーを介してダイアログ結果に対してアクションを実行します。
以前のリンクされたソリューションは、日付付きのイベントハンドラーアプローチを使用して、ダイアログが閉じられた後にアクションを実行します。このアプローチは、JavaFX2.2より前の実装に有効でした。JavaFX 8以降では、イベントハンドラーは必要ありません。代わりに、新しいStageshowAndWait()
メソッドを使用してください。例えば:
Stage dialog = new Stage();
// populate dialog with controls.
...
dialog.initOwner(parentStage);
dialog.initModality(Modality.APPLICATION_MODAL);
dialog.showAndWait();
// process result of dialog operation.
...
物事が期待どおりに機能するためには、ステージの所有者を初期化し、ステージのモダリティをWINDOW_MODALまたはAPPLICATION_MODALのいずれかに初期化することが重要であることに注意してください。
JavaFX 8とControlsFXには高品質の標準UIダイアログがいくつかあります。それらが要件に適合する場合は、独自に開発するのではなく、それらを使用することをお勧めします。これらの組み込みのJavaFXダイアログクラスとアラートクラスにもinitOwner
andメソッドがあるためinitModality
、showAndWait
必要に応じてモダリティを設定できます(デフォルトでは、組み込みダイアログはアプリケーションモーダルであることに注意してください)。
私のサンプルのようなアプリケーションを作成できます。これは、単一ファイルのJavaFXアプリケーションのみです。
public class JavaFXApplication1 extends Application {
@Override
public void start(Stage primaryStage) {
Button btn = new Button();
btn.setText("Say 'Hello World'");
btn.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
Stage stage;
stage = new Stage();
final SwingNode swingNode = new SwingNode();
createSwingContent(swingNode);
StackPane pane = new StackPane();
pane.getChildren().add(swingNode);
stage.initModality(Modality.APPLICATION_MODAL);
stage.setTitle("Swing in JavaFX");
stage.setScene(new Scene(pane, 250, 150));
stage.show();
}
});
StackPane root = new StackPane();
root.getChildren().add(btn);
Scene scene = new Scene(root, 300, 250);
primaryStage.setTitle("Hello World!");
primaryStage.setScene(scene);
primaryStage.show();
}
private void createSwingContent(final SwingNode swingNode) {
SwingUtilities.invokeLater(() -> {
try {
Path currentRelativePath = Paths.get("");
String s = currentRelativePath.toAbsolutePath().toString();
JasperDesign jasperDesign = JRXmlLoader.load(s + "/src/reports/report1.jrxml");
String query = "SELECT * FROM `accounttype`";
JRDesignQuery jrquery = new JRDesignQuery();
jrquery.setText(query);
jasperDesign.setQuery(jrquery);
JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign);
JasperPrint JasperPrint = JasperFillManager.fillReport(jasperReport, null, c);
//JRViewer viewer = new JRViewer(JasperPrint);
swingNode.setContent(new JRViewer(JasperPrint));
} catch (JRException ex) {
Logger.getLogger(AccountTypeController.class.getName()).log(Level.SEVERE, null, ex);
}
});
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
launch(args);
}
}