controlsfx Dialogs deprecated for what?

后端 未结 2 988
爱一瞬间的悲伤
爱一瞬间的悲伤 2021-01-03 23:08

ControlsFX class Dialogs is marked as deprecated.

What to use instead?

2条回答
  •  自闭症患者
    2021-01-03 23:47

    Now with java 8 update 60, even using old non-deprecated version of controlsfx doesn't work. So, the solution is using the native dialog API from javafx included in java 8 update 40 (doesn't need 3rd party libs). They aren't as straight forward and full of features as controls fx. But for faster coding, you could create a wrapper class, like this one I made:

    package br.atualy.devolucaodevenda.util;
    
    import javafx.scene.control.*;
    import javafx.scene.control.Label;
    import javafx.scene.control.TextArea;
    import javafx.scene.input.KeyCode;
    import javafx.scene.input.KeyEvent;
    import javafx.scene.layout.GridPane;
    import javafx.scene.layout.Priority;
    import javafx.stage.StageStyle;
    
    import java.awt.*;
    import java.io.PrintWriter;
    import java.io.StringWriter;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Optional;
    
    public class FxDialogs {
    
        public static void showInformation(String title, String message) {
            Alert alert = new Alert(Alert.AlertType.INFORMATION);
            alert.initStyle(StageStyle.UTILITY);
            alert.setTitle("Information");
            alert.setHeaderText(title);
            alert.setContentText(message);
    
            alert.showAndWait();
        }
    
        public static void showWarning(String title, String message) {
            Alert alert = new Alert(Alert.AlertType.WARNING);
            alert.initStyle(StageStyle.UTILITY);
            alert.setTitle("Warning");
            alert.setHeaderText(title);
            alert.setContentText(message);
    
            alert.showAndWait();
        }
    
        public static void showError(String title, String message) {
            Alert alert = new Alert(Alert.AlertType.ERROR);
            alert.initStyle(StageStyle.UTILITY);
            alert.setTitle("Error");
            alert.setHeaderText(title);
            alert.setContentText(message);
    
            alert.showAndWait();
        }
    
        public static void showException(String title, String message, Exception exception) {
            Alert alert = new Alert(Alert.AlertType.ERROR);
            alert.initStyle(StageStyle.UTILITY);
            alert.setTitle("Exception");
            alert.setHeaderText(title);
            alert.setContentText(message);
    
            StringWriter sw = new StringWriter();
            PrintWriter pw = new PrintWriter(sw);
            exception.printStackTrace(pw);
            String exceptionText = sw.toString();
    
            Label label = new Label("Details:");
    
            TextArea textArea = new TextArea(exceptionText);
            textArea.setEditable(false);
            textArea.setWrapText(true);
    
            textArea.setMaxWidth(Double.MAX_VALUE);
            textArea.setMaxHeight(Double.MAX_VALUE);
            GridPane.setVgrow(textArea, Priority.ALWAYS);
            GridPane.setHgrow(textArea, Priority.ALWAYS);
    
            GridPane expContent = new GridPane();
            expContent.setMaxWidth(Double.MAX_VALUE);
            expContent.add(label, 0, 0);
            expContent.add(textArea, 0, 1);
    
            alert.getDialogPane().setExpandableContent(expContent);
    
            alert.showAndWait();
        }
    
        public static final String YES = "Yes";
        public static final String NO = "No";
        public static final String OK = "OK";
        public static final String CANCEL = "Cancel";
    
        public static String showConfirm(String title, String message, String... options) {
            Alert alert = new Alert(Alert.AlertType.CONFIRMATION);
            alert.initStyle(StageStyle.UTILITY);
            alert.setTitle("Choose an option");
            alert.setHeaderText(title);
            alert.setContentText(message);
    
            //To make enter key press the actual focused button, not the first one. Just like pressing "space".
            alert.getDialogPane().addEventFilter(KeyEvent.KEY_PRESSED, event -> {
                if (event.getCode().equals(KeyCode.ENTER)) {
                    event.consume();
                    try {
                        Robot r = new Robot();
                        r.keyPress(java.awt.event.KeyEvent.VK_SPACE);
                        r.keyRelease(java.awt.event.KeyEvent.VK_SPACE);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
    
            if (options == null || options.length == 0) {
                options = new String[]{OK, CANCEL};
            }
    
            List buttons = new ArrayList<>();
            for (String option : options) {
                buttons.add(new ButtonType(option));
            }
    
            alert.getButtonTypes().setAll(buttons);
    
            Optional result = alert.showAndWait();
            if (!result.isPresent()) {
                return CANCEL;
            } else {
                return result.get().getText();
            }
        }
    
        public static String showTextInput(String title, String message, String defaultValue) {
            TextInputDialog dialog = new TextInputDialog(defaultValue);
            dialog.initStyle(StageStyle.UTILITY);
            dialog.setTitle("Input");
            dialog.setHeaderText(title);
            dialog.setContentText(message);
    
            Optional result = dialog.showAndWait();
            if (result.isPresent()) {
                return result.get();
            } else {
                return null;
            }
    
        }
    
    }
    

    To use the dialogs:

    FxDialogs.showInformation("Hi", "Good Morning y'all!");
    if (FxDialogs.showConfirm("Choose one baby!", "Can i ask you a question?", FxDialogs.YES, FxDialogs.NO).equals(FxDialogs.YES)) {
        FxDialogs.showWarning(null, "Pay attention to my next question!");
        String answer = FxDialogs.showTextInput("Are you a pink elephant disguised as a flying pig?", "Tell me!", "No");
        FxDialogs.showError(null, "You should not have said " + answer + "!");
        FxDialogs.showException("Now i'm angry", "I'm going home...", new RuntimeException("Exception caused by angry dinossaurs"));
    }
    

提交回复
热议问题