JavaFX 2.0 で共通ダイアログ (エラー、警告、確認) を作成して表示するにはどうすればよいですか? Dialog
、DialogBox
、Message
または何かのような「標準」クラスが見つかりません。
10 に答える
最近リリースされた JDK 1.8.0_40 では、JavaFX ダイアログ、アラートなどのサポートが追加されました。たとえば、確認ダイアログを表示するには、Alert クラスを使用します。
Alert alert = new Alert(AlertType.CONFIRMATION, "Delete " + selection + " ?", ButtonType.YES, ButtonType.NO, ButtonType.CANCEL);
alert.showAndWait();
if (alert.getResult() == ButtonType.YES) {
//do stuff
}
このリリースで追加されたクラスのリストを次に示します。
アップデート
RT-12643の実装の一環として、リリース 8u40 で公式の標準ダイアログが JavaFX に導入されます。これらは、2015 年 3 月頃に最終リリース形式で、現在 JavaFX 開発リポジトリでソース コード形式で利用できるはずです。
当面は、以下の ControlsFX ソリューションを使用できます...
ControlsFXは、JavaFX での一般的なダイアログ (エラー、警告、確認など) をサポートするための事実上の標準のサードパーティ ライブラリです。
他のいくつかの回答で指摘されているように、一般的なダイアログサポートを提供するサードパーティライブラリが他にも多数あり、セルゲイの回答のサンプルコードを使用して独自のダイアログを簡単に作成できます。
ただし、ControlsFXは、現時点で入手可能な最高品質の標準 JavaFX ダイアログを簡単に提供できると思います。以下は、 ControlsFX のドキュメントからのサンプルです。
Sergeyは正しいですが、それを呼び出したのと同じコードブロックで評価するために、ホームスピンダイアログから応答を取得する必要がある場合は、.show()ではなく.showAndWait()を使用する必要があります。SwingのOptionPaneで提供されるいくつかのダイアログタイプの私の表現は次のとおりです。
public class FXOptionPane {
public enum Response { NO, YES, CANCEL };
private static Response buttonSelected = Response.CANCEL;
private static ImageView icon = new ImageView();
static class Dialog extends Stage {
public Dialog( String title, Stage owner, Scene scene, String iconFile ) {
setTitle( title );
initStyle( StageStyle.UTILITY );
initModality( Modality.APPLICATION_MODAL );
initOwner( owner );
setResizable( false );
setScene( scene );
icon.setImage( new Image( getClass().getResourceAsStream( iconFile ) ) );
}
public void showDialog() {
sizeToScene();
centerOnScreen();
showAndWait();
}
}
static class Message extends Text {
public Message( String msg ) {
super( msg );
setWrappingWidth( 250 );
}
}
public static Response showConfirmDialog( Stage owner, String message, String title ) {
VBox vb = new VBox();
Scene scene = new Scene( vb );
final Dialog dial = new Dialog( title, owner, scene, "res/Confirm.png" );
vb.setPadding( new Inset(10,10,10,10) );
vb.setSpacing( 10 );
Button yesButton = new Button( "Yes" );
yesButton.setOnAction( new EventHandler<ActionEvent>() {
@Override public void handle( ActionEvent e ) {
dial.close();
buttonSelected = Response.YES;
}
} );
Button noButton = new Button( "No" );
noButton.setOnAction( new EventHandler<ActionEvent>() {
@Override public void handle( ActionEvent e ) {
dial.close();
buttonSelected = Response.NO;
}
} );
BorderPane bp = new BorderPane();
HBox buttons = new HBox();
buttons.setAlignment( Pos.CENTER );
buttons.setSpacing( 10 );
buttons.getChildren().addAll( yesButton, noButton );
bp.setCenter( buttons );
HBox msg = new HBox();
msg.setSpacing( 5 );
msg.getChildren().addAll( icon, new Message( message ) );
vb.getChildren().addAll( msg, bp );
dial.showDialog();
return buttonSelected;
}
public static void showMessageDialog( Stage owner, String message, String title ) {
showMessageDialog( owner, new Message( message ), title );
}
public static void showMessageDialog( Stage owner, Node message, String title ) {
VBox vb = new VBox();
Scene scene = new Scene( vb );
final Dialog dial = new Dialog( title, owner, scene, "res/Info.png" );
vb.setPadding( new Inset(10,10,10,10) );
vb.setSpacing( 10 );
Button okButton = new Button( "OK" );
okButton.setAlignment( Pos.CENTER );
okButton.setOnAction( new EventHandler<ActionEvent>() {
@Override public void handle( ActionEvent e ) {
dial.close();
}
} );
BorderPane bp = new BorderPane();
bp.setCenter( okButton );
HBox msg = new HBox();
msg.setSpacing( 5 );
msg.getChildren().addAll( icon, message );
vb.getChildren().addAll( msg, bp );
dial.showDialog();
}
}
ここの回答から適応: https://stackoverflow.com/a/7505528/921224
javafx.scene.control.Alert
JavaFX ダイアログの使用方法の詳細な説明については、code.makery によるJavaFX ダイアログ (公式)を参照してください。これらは、Swing ダイアログよりもはるかに強力で柔軟性があり、メッセージをポップアップするだけではありません。
import javafx.scene.control.Alert
import javafx.scene.control.Alert.AlertType;
import javafx.application.Platform;
public class ClassNameHere
{
public static void infoBox(String infoMessage, String titleBar)
{
/* By specifying a null headerMessage String, we cause the dialog to
not have a header */
infoBox(infoMessage, titleBar, null);
}
public static void infoBox(String infoMessage, String titleBar, String headerMessage)
{
Alert alert = new Alert(AlertType.INFORMATION);
alert.setTitle(titleBar);
alert.setHeaderText(headerMessage);
alert.setContentText(infoMessage);
alert.showAndWait();
}
}
留意すべき点の 1 つは、JavaFX が単一スレッドの GUI ツールキットであることです。つまり、このメソッドは JavaFX アプリケーション スレッドから直接呼び出す必要があります。ダイアログが必要な作業を行っている別のスレッドがある場合は、次の SO Q&A を参照してください: JavaFX2: バックグラウンド タスク/サービスを一時停止できますか? およびPlatform.Runlater および Task Javafx。
このメソッド呼び出しを使用するには:
ClassNameHere.infoBox("YOUR INFORMATION HERE", "TITLE BAR MESSAGE");
また
ClassNameHere.infoBox("YOUR INFORMATION HERE", "TITLE BAR MESSAGE", "HEADER MESSAGE");
これはJava 8u40以降で機能します:
Alert alert = new Alert(AlertType.INFORMATION, "Content here", ButtonType.OK);
alert.getDialogPane().setMinHeight(Region.USE_PREF_SIZE);
alert.show();
JavaFX UI Controls Projectで指定されたダイアログ ボックスを指定できます。私はそれがあなたを助けると思います
Dialogs.showErrorDialog(Stage object, errorMessage, "Main line", "Name of Dialog box");
Dialogs.showWarningDialog(Stage object, errorMessage, "Main line", "Name of Dialog box");
Clairton Luzの例を機能させるには、コード スニペットをメソッド で実行してFXApplicationThread
挿入する必要があります。Platform.runLater
Platform.runLater(() -> {
Alert alert = new Alert(Alert.AlertType.ERROR);
alert.setTitle("Error Dialog");
alert.setHeaderText("No information.");
alert.showAndWait();
}
);
それ以外の場合は、次のようになります。 java.lang.IllegalStateException: Not on FX application thread