Как создать и показать общие диалоги (ошибка, предупреждение, подтверждение) в JavaFX 2.0? Я не могу найти «стандартные» классы, такие как Dialog
, DialogBox
, Message
или что-то в этом роде.
Как создать и показать общий диалог (ошибка, предупреждение, подтверждение) в JavaFX 2.0?
Ответы (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
}
Вот список добавленных классов в этом релизе:
- javafx.scene.control.Dialog
- javafx.scene.control.Alert
- javafx.scene.control.TextInputDialog
- javafx.scene.control.ChoiceDialog
alert.setHeaderText("header text");
, если это то, что вам нужно.
- person nonybrighto; 13.04.2017
EDIT: в 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();
Обновить
Официальные стандартные диалоги появятся в JavaFX в выпуске 8u40 в рамках реализации RT-12643< /а>. Они должны быть доступны в окончательной форме примерно в марте 2015 года, а в виде исходного кода в разработке JavaFX. репозиторий сейчас.
А пока вы можете использовать решение ControlsFX ниже...
ControlsFX — это де-факто стандартная сторонняя библиотека для поддержки общих диалогов в JavaFX (ошибка, предупреждение, подтверждение и т. д.).
Существует множество других сторонних библиотек, которые обеспечивают общую поддержку диалогов, как указано в некоторых других ответах, и вы можете достаточно легко создавать свои собственные диалоги, используя пример кода в ответе Сергея.
Однако я считаю, что ControlsFX легко предоставляет стандартные диалоговые окна JavaFX самого высокого качества, доступные на данный момент. Вот несколько примеров из документации ControlsFX.
Сергей прав, но если вам нужно получить ответ от ваших домашних диалогов для оценки в том же блоке кода, который его вызвал, вы должны использовать .showAndWait(), а не .show(). Вот моя интерпретация нескольких типов диалогов, представленных в OptionPane Swing:
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 см. в разделе Диалоги 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: ">JavaFX2: Могу ли я приостановить фоновую задачу/службу? и Platform.Runlater и Задание Javafx.
Чтобы использовать этот вызов метода:
ClassNameHere.infoBox("YOUR INFORMATION HERE", "TITLE BAR MESSAGE");
or
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()
или подобным)
- person Lerk; 21.05.2019
Обновление: JavaFX 8u40 включает простые диалоги и предупреждения! ">сообщение в блоге, в котором объясняется, как использовать официальные диалоги JavaFX!
- Вы можете ознакомиться с отличным инструментом JavaFX Dialogs — это простые диалоги. в стиле JOptionPane из Swing
Вы можете предоставить диалоговое окно, предоставленное 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