Как создать и показать общие диалоги (Ошибка, Предупреждение, Подтверждение) в JavaFX 2.0? Я не могу найти "стандартные" классы, такие как Dialog
, DialogBox
, Message
или что-то в этом роде.
Как создать и показать общий диалог (ошибка, предупреждение, подтверждение) в JavaFX 2.0?
Ответ 1
Недавно выпущенный 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
}
Вот список добавленных классов в этом выпуске:
Ответ 2
РЕДАКТИРОВАТЬ: поддержка диалога была добавлена в JavaFX, см. fooobar.com/questions/102460/...
В 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();
Ответ 3
Обновление
Официальные стандартные диалоги приходят в JavaFX в выпуске 8u40, как часть реализации RT-12643. Они должны быть доступны в форме окончательного выпуска около марта 2015 года и в форме исходного кода в репозитории разработки JavaFX.
Тем временем вы можете использовать решение ControlsFX ниже...
ControlsFX - стандартная сторонняя библиотека defacto для поддержки общего диалога в JavaFX (ошибка, предупреждение, подтверждение и т.д.).
Существует множество других сторонних библиотек, которые предоставляют общую поддержку диалогов, как указано в некоторых других ответах, и вы можете легко создавать свои собственные диалоги, используя пример кода в ответе Сергея.
Тем не менее, я считаю, что ControlsFX легко предоставляют диалоги JavaFX лучшего качества, доступные на данный момент. Вот несколько примеров из документации ControlsFX.
Ответ 4
Сергей прав, но если вам нужно получить ответ от своего диалогового окна (ов) для поиска в том же блоке кода, который его вызвал, вы должны использовать .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();
}
}
Ответ 5
Адаптировано из ответа здесь: fooobar.com/questions/102466/...
javafx.scene.control.Alert
Подробное описание того, как использовать диалоги JavaFX, можно найти здесь: Диалоги JavaFX (официальный) с помощью code.makery. Они гораздо более мощные и гибкие, чем диалоги 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 Q & As: JavaFX2: могу ли я приостановить фоновое задание/услугу? и "Платформа" и "Javafx" .
Чтобы использовать этот вызов метода:
ClassNameHere.infoBox("YOUR INFORMATION HERE", "TITLE BAR MESSAGE");
или
ClassNameHere.infoBox("YOUR INFORMATION HERE", "TITLE BAR MESSAGE", "HEADER MESSAGE");
Ответ 6
- Вы можете взглянуть на отличный инструмент Диалоги JavaFX - это простые диалоги в стиле JOptionPane из Swing
Ответ 7
Вы можете дать диалоговое окно, которое дано 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");
Ответ 8
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();
}
}
Ответ 9
Это работает с Java 8u40:
Alert alert = new Alert(AlertType.INFORMATION, "Content here", ButtonType.OK);
alert.getDialogPane().setMinHeight(Region.USE_PREF_SIZE);
alert.show();