如何在JavaFX 2.0中创建和显示常见对话框(错误,警告,确认)?我找不到任何“标准”类,如Dialog
,DialogBox
,Message
或什么的。
如何在JavaFX 2.0中创建和显示常见对话框(错误,警告,确认)?我找不到任何“标准”类,如Dialog
,DialogBox
,Message
或什么的。
Answers:
最近发布的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
}
以下是此版本中添加的类的列表:
alert.setHeaderText("header text");
,如果这是你所需要的
编辑:对话框支持已添加到JavaFX,请参阅https://stackoverflow.com/a/28887273/1054140
2011年没有通用的对话框支持。您必须自己编写以下代码new Stage()
:
Stage dialogStage = new Stage();
dialogStage.initModality(Modality.WINDOW_MODAL);
VBox vbox = new VBox(new Text("Hi"), new Button("Ok."));
vbox.setAlignment(Pos.CENTER);
vbox.setPadding(new Insets(15));
dialogStage.setScene(new Scene(vbox));
dialogStage.show();
更新资料
作为RT-12643实现的一部分,JavaFX的正式标准对话框即将发布到8u40版中。它们应在2015年3月左右以最终发行版的形式提供,现在在JavaFX开发存储库中以源代码的形式提供。
同时,您可以使用下面的ControlsFX解决方案...
ControlsFX是事实上的标准第三方库,用于JavaFX中的常见对话框支持(错误,警告,确认等)。
如其他答案中所指出的,还有许多其他的第三方库可提供常见的对话框支持,并且您可以使用Sergey的答案中的示例代码轻松地创建自己的对话框。
但是,我相信ControlsFX可以轻松提供当前可用的质量最好的标准JavaFX对话框。这是ControlsFX文档中的一些示例。
Sergey是正确的,但如果需要从调用它的同一个代码块中获得自定义对话框的响应以进行评估,则应使用.showAndWait()而不是.show()。这是我对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对话框的深入说明,请参见: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();
}
}
要记住的一件事是JavaFX是一个单线程GUI工具箱,这意味着应该直接从JavaFX应用程序线程调用此方法。如果您有另一个线程正在工作,需要对话,请参阅以下SO问答: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();
Platform.runLater()
或类似的行为)
更新: JavaFX 8u40包括简单的对话框和警报!,请查看此博客文章,其中解释了如何使用官方JavaFX对话框!
您可以提供由JavaFX UI控件项目提供的对话框。我认为这会帮助你
Dialogs.showErrorDialog(Stage object, errorMessage, "Main line", "Name of Dialog box");
Dialogs.showWarningDialog(Stage object, errorMessage, "Main line", "Name of Dialog box");
public myClass{
private Stage dialogStage;
public void msgBox(String title){
dialogStage = new Stage();
GridPane grd_pan = new GridPane();
grd_pan.setAlignment(Pos.CENTER);
grd_pan.setHgap(10);
grd_pan.setVgap(10);//pading
Scene scene =new Scene(grd_pan,300,150);
dialogStage.setScene(scene);
dialogStage.setTitle("alert");
dialogStage.initModality(Modality.WINDOW_MODAL);
Label lab_alert= new Label(title);
grd_pan.add(lab_alert, 0, 1);
Button btn_ok = new Button("fermer");
btn_ok.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent arg0) {
// TODO Auto-generated method stub
dialogStage.hide();
}
});
grd_pan.add(btn_ok, 0, 2);
dialogStage.show();
}
}
要使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