/** * Creates the javafx Dialog via the producer, shows it and returns the evaluated result as Optional. * * @param <T> type of the result * @param <P> result type of the preProducer * @param <V> * @param dialogProducer the javafx Dialog producer, must not be null and must not return null. * @return the result of the evaluation, never null. */ public <T, V extends Dialog<T>> Optional<T> eval(Callable<V> dialogProducer) { try { Objects.requireNonNull(dialogProducer, "The dialogProducer is null, not allowed"); V dialog = FxSaft.dispatch(dialogProducer); Params p = buildParameterBackedUpByDefaults(dialog.getClass()); if ( isOnceModeAndActiveWithSideeffect(p.key()) ) return Optional.empty(); dialog.getDialogPane().getScene().setRoot(new BorderPane()); // Remove the DialogPane form the Scene, otherwise an Exception is thrown Window window = constructAndShow(SwingCore.wrap(dialog.getDialogPane()), p, Dialog.class); // Constructing the JFrame/JDialog, setting the parameters and makeing it visible dialog.getDialogPane().getButtonTypes().stream().map(t -> dialog.getDialogPane().lookupButton(t)).forEach(b -> { // Add Closing behavior on all buttons. ((Button)b).setOnAction(e -> { L.debug("Close on Dialog called"); Ui.closeWindowOf(window); }); }); wait(window); return Optional.ofNullable(dialog.getResult()); } catch (Exception ex) { throw new RuntimeException(ex); } }
private void setup() { ProjectConfig config = ProjectConfig.getLast(); Dialog<ProjectConfig> dialog = new Dialog<>(); //dialog.initModality(Modality.APPLICATION_MODAL); dialog.setResizable(true); dialog.setTitle("UID Setup"); dialog.getDialogPane().getButtonTypes().addAll(ButtonType.OK, ButtonType.CANCEL); Node okButton = dialog.getDialogPane().lookupButton(ButtonType.OK); UidSetupPane setupPane = new UidSetupPane(config, dialog.getOwner(), okButton); dialog.getDialogPane().setContent(setupPane); dialog.setResultConverter(button -> button == ButtonType.OK ? config : null); dialog.showAndWait().ifPresent(newConfig -> { setupPane.updateConfig(); if (!newConfig.isValid()) return; newConfig.saveAsLast(); }); }
/** * Utility method to center a Dialog/Alert on the middle of the current * screen. Used to workaround a "bug" with the current version of JavaFX (or * the SWT/JavaFX embedding?) where alerts always show on the primary * screen, not necessarily the current one. * * @param dialog * The dialog to reposition. It must be already shown, or else * this will do nothing. * @param referenceNode * The dialog should be moved to the same screen as this node's * window. */ public static void centerDialogOnScreen(Dialog<?> dialog, Node referenceNode) { Window window = referenceNode.getScene().getWindow(); if (window == null) { return; } Rectangle2D windowRectangle = new Rectangle2D(window.getX(), window.getY(), window.getWidth(), window.getHeight()); List<Screen> screens = Screen.getScreensForRectangle(windowRectangle); Screen screen = screens.stream() .findFirst() .orElse(Screen.getPrimary()); Rectangle2D screenBounds = screen.getBounds(); dialog.setX((screenBounds.getWidth() - dialog.getWidth()) / 2 + screenBounds.getMinX()); // dialog.setY((screenBounds.getHeight() - dialog.getHeight()) / 2 + screenBounds.getMinY()); }
public void bind(Dialog<?> dialog) { if (map.containsKey(dialog)) { return; } ChangeListener<? super SkinStyle> listener = (ob, o, n) -> { dialog.getDialogPane().getStylesheets().remove(o.getURL()); dialog.getDialogPane().getStylesheets().add(n.getURL()); }; if (skin.get() != null) { dialog.getDialogPane().getStylesheets().add(skin.get().getURL()); } skin.addListener(listener); map.put(dialog, listener); dialog.setOnHidden(e -> { skin.removeListener(listener); map.remove(dialog); }); }
/** * Creates the menu for editing the properties of a widget. * * @param tile the tile to pull properties from * @return the edit property menu */ private void showPropertySheet(Tile<?> tile) { ExtendedPropertySheet propertySheet = new ExtendedPropertySheet(); propertySheet.getItems().add(new ExtendedPropertySheet.PropertyItem<>(tile.getContent().titleProperty())); Dialog<ButtonType> dialog = new Dialog<>(); if (tile.getContent() instanceof Widget) { ((Widget) tile.getContent()).getProperties().stream() .map(ExtendedPropertySheet.PropertyItem::new) .forEachOrdered(propertySheet.getItems()::add); } dialog.setTitle("Edit widget properties"); dialog.getDialogPane().getStylesheets().setAll(AppPreferences.getInstance().getTheme().getStyleSheets()); dialog.getDialogPane().setContent(new BorderPane(propertySheet)); dialog.getDialogPane().getButtonTypes().addAll(ButtonType.CLOSE); dialog.showAndWait(); }
@Override public void initialize(URL location, ResourceBundle resources) { logoImg.setImage(UIUtils.getImage("logo.png")); Dialog diag = new Dialog(); diag.getDialogPane().setContent(borderPane); diag.getDialogPane().setBackground(Background.EMPTY); diag.setResizable(true); UIUtils.setIcon(diag); ButtonType closeButton = new ButtonType("Close", ButtonBar.ButtonData.OK_DONE); diag.getDialogPane().getButtonTypes().addAll(closeButton); diag.setTitle("About HueSense"); Optional<ButtonType> opt = diag.showAndWait(); if (opt.isPresent() && opt.get().getButtonData() == ButtonBar.ButtonData.OK_DONE) { // nothing } }
public void show() { paneController.load(); ResourceBundle i18n = toolBox.getI18nBundle(); Dialog<ButtonType> dialog = new Dialog<>(); dialog.setTitle(i18n.getString("prefsdialog.title")); dialog.setHeaderText(i18n.getString("prefsdialog.header")); GlyphsFactory gf = MaterialIconFactory.get(); Text settingsIcon = gf.createIcon(MaterialIcon.SETTINGS, "30px"); dialog.setGraphic(settingsIcon); dialog.getDialogPane() .getButtonTypes() .addAll(ButtonType.OK, ButtonType.CANCEL); dialog.getDialogPane() .setContent(paneController.getRoot()); dialog.getDialogPane() .getStylesheets() .addAll(toolBox.getStylesheets()); Optional<ButtonType> buttonType = dialog.showAndWait(); buttonType.ifPresent(bt -> { if (bt == ButtonType.OK) { paneController.save(); } }); }
protected void init() { String tooltip = toolBox.getI18nBundle().getString("buttons.upon"); MaterialIconFactory iconFactory = MaterialIconFactory.get(); Text icon = iconFactory.createIcon(MaterialIcon.VERTICAL_ALIGN_BOTTOM, "30px"); Text icon2 = iconFactory.createIcon(MaterialIcon.VERTICAL_ALIGN_BOTTOM, "30px"); initializeButton(tooltip, icon); ResourceBundle i18n = toolBox.getI18nBundle(); Dialog<String> dialog = dialogController.getDialog(); dialog.setTitle(i18n.getString("buttons.upon.dialog.title")); dialog.setHeaderText(i18n.getString("buttons.upon.dialog.header")); dialog.setContentText(i18n.getString("buttons.upon.dialog.content")); dialog.setGraphic(icon2); dialog.getDialogPane().getStylesheets().addAll(toolBox.getStylesheets()); }
@Override public void start(Stage primaryStage) throws Exception { MediaService mediaService = DemoConstants.newMediaService(); AnnotationService annotationService = DemoConstants.newAnnotationService(); Label label = new Label(); Button button = new JFXButton("Browse"); Dialog<Media> dialog = new SelectMediaDialog(annotationService, mediaService, uiBundle); button.setOnAction(e -> { Optional<Media> media = dialog.showAndWait(); media.ifPresent(m -> label.setText(m.getUri().toString())); }); VBox vBox = new VBox(label, button); Scene scene = new Scene(vBox, 400, 200); primaryStage.setScene(scene); primaryStage.show(); primaryStage.setOnCloseRequest(e -> { Platform.exit(); System.exit(0); }); }
public void showAbout(ActionEvent actionEvent) throws URISyntaxException { Dialog<Void> dialog = new Dialog<>(); dialog.setTitle("Tenhou Visualizer について"); dialog.initOwner(this.root.getScene().getWindow()); dialog.getDialogPane().getStylesheets().add(this.getClass().getResource(Main.properties.getProperty("css")).toExternalForm()); dialog.getDialogPane().setGraphic(new ImageView(new Image("/logo.png"))); dialog.getDialogPane().setHeaderText("TenhouVisualizer v0.3"); final Hyperlink oss = new Hyperlink("open-source software"); final URI uri = new URI("https://crazybbb.github.io/tenhou-visualizer/thirdparty"); oss.setOnAction(e -> { try { Desktop.getDesktop().browse(uri); } catch (IOException e1) { throw new UncheckedIOException(e1); } }); dialog.getDialogPane().setContent(new TextFlow(new Label("Powered by "), oss)); dialog.getDialogPane().getButtonTypes().add(ButtonType.CLOSE); dialog.showAndWait(); }
/** * Constructs and displays dialog based on the FXML at the specified URL * * @param url * the location of the FXML file, relative to the * {@code sic.nmsu.javafx} package * @param stateInit * a consumer used to configure the controller before FXML injection * @return */ public static <R, C extends FXDialogController<R>> R show(String url, Consumer<C> stateInit) { final Pair<Parent, C> result = FXController.get(url, stateInit); final Parent view = result.getValue0(); final C ctrl = result.getValue1(); final Dialog<R> dialog = new Dialog<>(); dialog.titleProperty().bind(ctrl.title); final DialogPane dialogPane = dialog.getDialogPane(); dialogPane.setContent(view); dialogPane.getButtonTypes().add(ButtonType.CLOSE); final Stage window = (Stage) dialogPane.getScene().getWindow(); window.getIcons().add(new Image("images/recipe_icon.png")); final Node closeButton = dialogPane.lookupButton(ButtonType.CLOSE); closeButton.managedProperty().bind(closeButton.visibleProperty()); closeButton.setVisible(false); ctrl.dialog = dialog; ctrl.dialog.showAndWait(); return ctrl.result; }
public static void enableClosing(Alert alert) { try { Field dialogField = Dialog.class.getDeclaredField("dialog"); dialogField.setAccessible(true); Object dialog = dialogField.get(alert); Field stageField = dialog.getClass().getDeclaredField("stage"); stageField.setAccessible(true); Stage stage = (Stage) stageField.get(dialog); stage.setOnCloseRequest(null); stage.addEventFilter(KeyEvent.KEY_PRESSED, keyEvent -> { if (keyEvent.getCode() == KeyCode.ESCAPE) { ((Button) alert.getDialogPane().lookupButton(ButtonType.OK)).fire(); } }); } catch (Exception ex) { // no point ex.printStackTrace(); } }
private void loadCombinason() { scene.addEventFilter(KeyEvent.KEY_PRESSED, t -> { String codeStr = t.getCode().toString(); if(!key.toString().endsWith("_"+codeStr)){ key.append("_").append(codeStr); } }); scene.addEventFilter(KeyEvent.KEY_RELEASED, t -> { if(key.length()>0) { if("_CONTROL_C_L_E_M".equals(key.toString())){ // Create the custom dialog. Dialog<Void> dialog = new Dialog<>(); dialog.setTitle(Configuration.getBundle().getString("ui.menu.easteregg")); dialog.setHeaderText(null); dialog.setContentText(null); dialog.setGraphic(new ImageView(this.getClass().getResource("images/goal.gif").toString())); dialog.getDialogPane().getButtonTypes().addAll(ButtonType.OK); dialog.showAndWait(); } key = new StringBuilder(); } }); }
private void loadDefaultConfigFile() { Task task = new Task() { @Override protected Object call() throws Exception { logger.debug("Started loading default config file"); try (InputStream inputStream = AppInitializerImpl.class.getResourceAsStream("/pdr_configuration.xml"); OutputStream outputStream = new FileOutputStream(configFile)) { int read; byte[] bytes = new byte[1024]; while ((read = inputStream.read(bytes)) != -1) { outputStream.write(bytes, 0, read); } logger.debug("Successfully loaded default configuration file"); } catch (IOException e) { initExceptions.add(new RuntimeException("Failed to copy default configuration to " + configFile.getAbsolutePath(), e)); } return null; } }; Dialog dialog = FXMLUtils.getProgressDialog(primaryStage, task); executeTask(task); dialog.showAndWait(); }
@FXML private void handleExport() { File file = FXMLUtils.showSaveFileChooser(resources.getString("choose.output.file"), lastSavePath, "PDR report", stage, new FileChooser.ExtensionFilter("Text file (*.txt)", "*.txt")); if (file != null) { updateLastSavePath(file.getParent()); Task task = new Task() { @Override protected Object call() throws Exception { try (OutputStream out = new FileOutputStream(file)) { byte[] byteArray = text.get().getBytes(); out.write(byteArray, 0, byteArray.length); } catch (IOException e) { logger.error(e); } return null; } }; Dialog dialog = FXMLUtils.getProgressDialog(stage, task); executor.execute(task); dialog.showAndWait(); } }
/** * initiliaze the dialog. * * @param stage where to show the dialog. * @param testsystem to store data in * @return {@link Dialog} * @throws IOException when initialization failed */ public Dialog<Object> initDialog(Stage stage, Testsystem testsystem) throws IOException { if (testsystem != null) { edit = true; this.testsystem = new Testsystem(testsystem.getId(), testsystem.getName(), testsystem.getUrl()); this.testsystem.getFeatures().addAll(testsystem.getFeatures()); } else { testsystem = new Testsystem(); this.testsystem = testsystem; } this.stage = stage; dialog = new Dialog<>(); dialog.setHeaderText(languageHandler.getMessage(DialogConstants.DIALOG_HEADER)); dialog.setTitle(languageHandler.getMessage(DialogConstants.DIALOG_TITLE)); dialog.getDialogPane().setContent(new WizzardDialogFirstStep().init(this.testsystem, this, languageHandler.getDefaultResourceBundle())); dialog.setResizable(false); dialog.getDialogPane().getButtonTypes().add(ButtonType.CANCEL); dialog.getDialogPane().lookupButton(ButtonType.CANCEL).setVisible(false); dialog.setGraphic(new ImageView(new Image("icons/info_icon-2.png"))); return dialog; }
/** * Displays a confirmation dialog box. * * @param node a node attached to the stage to be used as the owner of the dialog. * @param header the header message for the dialog. * @param content the main message for the dialog. * @param icon the icon for the dialog. * @param buttons the {@link ButtonType} that should be displayed on the confirmation dialog. * @return the {@link ButtonType} corresponding to user's choice. */ public static ButtonType confirmDialog(Node node, String header, String content, Node icon, ButtonType... buttons) { Dialog<ButtonType> dlg = new Dialog<>(); dlg.initOwner(Dialogs.getStage(node)); setAlwaysOnTop(dlg); dlg.setTitle("binjr"); dlg.getDialogPane().setHeaderText(header); dlg.getDialogPane().setContentText(content); if (icon == null) { icon = new Region(); icon.getStyleClass().addAll("dialog-icon", "help-icon"); } dlg.getDialogPane().setGraphic(icon); if (buttons == null || buttons.length == 0) { buttons = new ButtonType[]{ButtonType.YES, ButtonType.NO}; } dlg.getDialogPane().getButtonTypes().addAll(buttons); return dlg.showAndWait().orElse(ButtonType.CANCEL); }
/** * Displays a warning dialog with title, message and the options "OK", "Cancel" and "Ignore". * The given callbacks are run when the respective buttons are pressed. * * @param title * The title to use for the dialog * @param message * The message of the dialog * @param okCallback * Something to run when the user clicks OK * @param cancelCallback * Something to run when the user clicks Cancel * @param ignoreCallback * Something to run when the user clicks Ignore */ public void warn(String title, String message, Runnable okCallback, Runnable cancelCallback, Runnable ignoreCallback) { Dialog<ButtonType> d = createBasicDialog(title, message); d.getDialogPane().getButtonTypes().addAll(OK, CANCEL, IGNORE); Optional<ButtonType> result = d.showAndWait(); if (result.isPresent()) { if (result.get() == OK) { okCallback.run(); } else if (result.get() == CANCEL) { cancelCallback.run(); } else if (result.get() == IGNORE) { ignoreCallback.run(); } } }
private LoginDialog(DialogDescriptor descriptor){ super(new Dialog<DialogResult>()); Map<TextFieldDescription, TextField> fields = createFields(descriptor.getFields()); Node loginButton = setupButtons(fields); setLoginButton(loginButton); //TODO perform fields validation // // Do some validation (using the Java 8 lambda syntax). // username.textProperty().addListener((observable, oldValue, newValue) -> { // loginButton.setDisable(newValue.trim().isEmpty()); // }); // // // // // Request focus on the username field by default. // Platform.runLater(() -> username.requestFocus()); }
/** * Create the dialog for choosing courses. * * @param courseList the list of courses to show in the dialog (let the user pick from them) * @return the controller of the dialog window, enabling to display the dialog and read the selected result */ public ChooseCourseController create(List<Course> courseList) { FXMLLoader fxmlLoader = this.fxmlLoader.get(); DialogPane dialogPane = null; try (InputStream is = getClass().getResourceAsStream("ChooseCourseDialogPane.fxml")) { dialogPane = fxmlLoader.load(is); } catch (IOException e) { AlertCreator.handleLoadLayoutError(fxmlLoader.getResources(), e); } ChooseCourseController chooseCourseController = fxmlLoader.getController(); chooseCourseController.setCourseList(courseList); Dialog<ButtonType> dialog = new Dialog<>(); dialog.setDialogPane(dialogPane); chooseCourseController.setDialog(dialog); dialog.setTitle("StudyGuide"); return chooseCourseController; }
/** * Create the dialog for entering a String. * * @param prompt the string message to prompt the user with * @return the controller of the dialog window, enabling to display the dialog and read the selected result */ public EnterStringController create(String prompt) { FXMLLoader fxmlLoader = this.fxmlLoader.get(); DialogPane dialogPane = null; try (InputStream is = getClass().getResourceAsStream("EnterStringDialogPane.fxml")) { dialogPane = fxmlLoader.load(is); } catch (IOException e) { AlertCreator.handleLoadLayoutError(fxmlLoader.getResources(), e); } dialogPane.setHeaderText(prompt); EnterStringController enterStringController = fxmlLoader.getController(); Dialog<ButtonType> dialog = new Dialog<>(); dialog.initModality(Modality.APPLICATION_MODAL); dialog.setDialogPane(dialogPane); enterStringController.setDialog(dialog); dialog.setTitle("StudyGuide"); dialog.setOnShown(event -> enterStringController.getTextField().requestFocus()); return enterStringController; }
/** * Handles search, displaying the found courses for user choice and selecting one of them. * * @param input the input string (id or name part) * @return null if the course wasn't found or the user didn't choose anything */ public Course searchAndChooseCourse(String input) { List<Course> courses = findCourses(input).collect(Collectors.toList()); logger.debug("Courses found for input \"{}\": {}", input, Arrays.toString(courses.toArray())); if (courses.isEmpty()) { AlertCreator.showAlert(Alert.AlertType.INFORMATION, String.format(messages.getString("studyPane.cannotFindCourse"), input)); return null; } ChooseCourseController controller = chooseCourseDialogPaneCreator.create(courses); Dialog<ButtonType> chooseCourseDialog = controller.getDialog(); Optional<ButtonType> result = chooseCourseDialog.showAndWait(); if (result.isPresent() && result.get() == ButtonType.APPLY) { return controller.getChosenCourse(); } else { return null; } }
/** * Initialize a dialog by setting its title, header and content * and set window style to "utility dialog". * * @param dialog The dialog to initialize * @param keyTitle Key for dialog title in the translation file * @param keyHeader Key for dialog header in the translation file * @param keyContent Key for dialog content in the translation file * @param windowData The position and size of the parent window */ protected static void prepareDialog(final Dialog dialog, final String keyTitle, final String keyHeader, final String keyContent, final ParentWindowData windowData) { dialog.setTitle(TRANSLATIONS.getString(keyTitle)); dialog.setHeaderText(TRANSLATIONS.getString(keyHeader)); dialog.setContentText(TRANSLATIONS.getString(keyContent)); ((Stage) dialog.getDialogPane().getScene().getWindow()).initStyle(StageStyle.UTILITY); dialog.setResizable(false); /* Handler to place the dialog in the middle of the main window instead of the middle * of the screen; the width oh the dialog is fixed. */ dialog.setOnShown(new EventHandler<DialogEvent>() { public void handle(final DialogEvent event) { dialog.setWidth(DIALOG_WIDTH); dialog.getDialogPane().setMaxWidth(DIALOG_WIDTH); dialog.getDialogPane().setMinWidth(DIALOG_WIDTH); dialog.setX(windowData.getX() + (windowData.getWidth() / 2) - (dialog.getWidth() / 2)); dialog.setY(windowData.getY() + 30); } }); }
public Optional<String> editDocument(String formattedJson, int cursorPosition) { Dialog<String> dialog = new Dialog<>(); dialog.getDialogPane().getButtonTypes().addAll(ButtonType.OK, ButtonType.CANCEL); dialog.setTitle("MongoFX - edit document"); dialog.setResizable(true); dialog.getDialogPane().getStylesheets().add(getClass().getResource("/ui/editor.css").toExternalForm()); CodeArea codeArea = setupEditorArea(formattedJson, dialog, cursorPosition); dialog.setResultConverter(bt -> { if (ButtonData.OK_DONE == bt.getButtonData()) { return codeArea.getText(); } return null; }); return dialog.showAndWait(); }
private CodeArea setupEditorArea(String formattedJson, Dialog<String> dialog, int cursorPosition) { URL url = getClass().getResource("/ui/Editor.fxml"); final FXMLLoader loader = createLoader(url); BorderPane root = load(url, loader); EditorController editorController = loader.getController(); CodeArea codeArea = editorController.getCodeArea(); codeArea.setPrefSize(500, 400); codeArea.replaceText(formattedJson); codeArea.getUndoManager().forgetHistory(); // stackpane is workaround https://github.com/TomasMikula/RichTextFX/issues/196 dialog.getDialogPane().setContent(new StackPane(root)); Platform.runLater(() -> { codeArea.selectRange(cursorPosition, cursorPosition); codeArea.requestFocus(); }); return codeArea; }
private void pickStylerToConfigure(final List<Parameterizable> stylers) { if (stylers.size() == 1) { selectInCombo(stylers.get(0)); return; } else if (stylers.isEmpty()) { selectInCombo(null); return; } List<ParameterizableWrapper> pw = new ArrayList<>(stylers.size()); stylers.stream().forEach((p) -> { pw.add(new ParameterizableWrapper(p)); }); Dialog<ParameterizableWrapper> dialog = new ChoiceDialog<>(pw.get(0), pw); ButtonType bt = new ButtonType("choose", ButtonBar.ButtonData.OK_DONE); dialog.getDialogPane().getButtonTypes().clear(); dialog.getDialogPane().getButtonTypes().add(bt); dialog.setTitle("Please choose"); dialog.setHeaderText(null); dialog.setResizable(true); dialog.setContentText("choose the styler or condition you want to configure"); Optional<ParameterizableWrapper> choice = dialog.showAndWait(); if (choice.isPresent()) { selectInCombo(choice.get().p); } }
/** * @param dialog The dialog to load the camera with. * @param cameraSourceSupplier The supplier that will create the camera. * @param failureCallback The handler for when the camera source supplier throws an IO * Exception. */ private void loadCamera(Dialog<ButtonType> dialog, SupplierWithIO<CameraSource> cameraSourceSupplier, Consumer<IOException> failureCallback) { assert Platform.isFxApplicationThread() : "Should only run in FX thread"; dialog.showAndWait().filter(Predicate.isEqual(ButtonType.OK)).ifPresent(result -> { try { // Will try to create the camera with the values from the supplier final CameraSource source = cameraSourceSupplier.getWithIO(); eventBus.post(new SourceAddedEvent(source)); } catch (IOException e) { // This will run it again with the new values retrieved by the supplier failureCallback.accept(e); loadCamera(dialog, cameraSourceSupplier, failureCallback); } }); }
/** * If there are any steps in the pipeline, give the user a chance to cancel an action or save the * current project. * * @return true If the user has not chosen to */ private boolean showConfirmationDialogAndWait() { if (!pipeline.getSteps().isEmpty() && project.isSaveDirty()) { final ButtonType save = new ButtonType("Save"); final ButtonType dontSave = ButtonType.NO; final ButtonType cancel = ButtonType.CANCEL; final Dialog<ButtonType> dialog = new Dialog<>(); dialog.getDialogPane().getStylesheets().addAll(root.getStylesheets()); dialog.getDialogPane().setStyle(root.getStyle()); dialog.setTitle("Save Project?"); dialog.setHeaderText("Save the current project first?"); dialog.getDialogPane().getButtonTypes().setAll(save, dontSave, cancel); if (!dialog.showAndWait().isPresent()) { return false; } else if (dialog.getResult().equals(cancel)) { return false; } else if (dialog.getResult().equals(save)) { // If the user chose "Save", automatically show a save dialog and block until the user // has had a chance to save the project. return saveProject(); } } return true; }
@FXML protected void deploy() { eventBus.post(new WarningEvent( "Deploy has been deprecated", "The deploy tool has been deprecated and is no longer supported. " + "It will be removed in a future release.\n\n" + "Instead, use code generation to create a Java, C++, or Python class that handles all" + " the OpenCV code and can be easily integrated into a WPILib robot program.")); ImageView graphic = new ImageView(new Image("/edu/wpi/grip/ui/icons/settings.png")); graphic.setFitWidth(DPIUtility.SMALL_ICON_SIZE); graphic.setFitHeight(DPIUtility.SMALL_ICON_SIZE); deployPane.requestFocus(); Dialog<ButtonType> dialog = new Dialog<>(); dialog.setTitle("Deploy"); dialog.setHeaderText("Deploy"); dialog.setGraphic(graphic); dialog.getDialogPane().getButtonTypes().setAll(ButtonType.CLOSE); dialog.getDialogPane().styleProperty().bind(root.styleProperty()); dialog.getDialogPane().getStylesheets().setAll(root.getStylesheets()); dialog.getDialogPane().setContent(deployPane); dialog.setResizable(true); dialog.showAndWait(); }
/** * Creates the javafx Dialog via the producer, supplies the consumer part with the result of the preProducer, shows it and returns the evaluated result as * Optional. * * @param <T> type of the result * @param <P> result type of the preProducer * @param <V> * @param preProducer the preproducer, must not be null * @param dialogProducer the javafx Dialog producer, must not be null and must not return null. * @return the result of the evaluation, never null. */ public <T, P, V extends Dialog<T> & Consumer<P>> Optional<T> eval(Callable<P> preProducer, Callable<V> dialogProducer) { try { Objects.requireNonNull(dialogProducer, "The dialogProducer is null, not allowed"); V dialog = FxSaft.dispatch(dialogProducer); Params p = buildParameterBackedUpByDefaults(dialog.getClass()); P preResult = callWithProgress(preProducer); p.optionalSupplyId(preResult); if ( isOnceModeAndActiveWithSideeffect(p.key()) ) return Optional.empty(); dialog.accept(preResult); // Calling the preproducer and setting the result in the panel dialog.getDialogPane().getScene().setRoot(new BorderPane()); // Remove the DialogPane form the Scene, otherwise an Exception is thrown Window window = constructAndShow(SwingCore.wrap(dialog.getDialogPane()), p, Dialog.class); // Constructing the JFrame/JDialog, setting the parameters and makeing it visible dialog.getDialogPane().getButtonTypes().stream().map(t -> dialog.getDialogPane().lookupButton(t)).forEach(b -> { // Add Closing behavior on all buttons. ((Button)b).setOnAction(e -> { L.debug("Close on Dialog called"); Ui.closeWindowOf(window); }); }); wait(window); return Optional.ofNullable(dialog.getResult()); } catch (Exception ex) { throw new RuntimeException(ex); } }
@Override public Optional<Color> colorInput(String action, String question, Color _default) { Dialog<Color> dialog = new Dialog<>(); dialog.setTitle(action); dialog.setHeaderText(question); ColorPicker picker = new ColorPicker(_default); Button randomiser = new Button("Mix"); randomiser.setOnAction(e -> { Color current = picker.getValue(); Color shifted = Item.shiftColor(current); picker.setValue(shifted); }); HBox box = new HBox(); box.getChildren().addAll(picker, randomiser); dialog.getDialogPane().setContent(box); dialog.getDialogPane().getButtonTypes().addAll( ButtonType.OK, ButtonType.CANCEL); dialog.setResultConverter(buttonType -> { if (buttonType.equals(ButtonType.OK)) { return picker.getValue(); } else { return null; } }); return dialog.showAndWait(); }
private void newProject() { ProjectConfig config = ProjectConfig.getLast(); Dialog<ProjectConfig> dialog = new Dialog<>(); //dialog.initModality(Modality.APPLICATION_MODAL); dialog.setResizable(true); dialog.setTitle("Project configuration"); dialog.getDialogPane().getButtonTypes().addAll(ButtonType.OK, ButtonType.CANCEL); Node okButton = dialog.getDialogPane().lookupButton(ButtonType.OK); dialog.getDialogPane().setContent(new NewProjectPane(config, dialog.getOwner(), okButton)); dialog.setResultConverter(button -> button == ButtonType.OK ? config : null); dialog.showAndWait().ifPresent(newConfig -> { if (!newConfig.isValid()) return; newConfig.saveAsLast(); gui.getMatcher().reset(); gui.onProjectChange(); gui.runProgressTask("Initializing files...", progressReceiver -> gui.getMatcher().init(newConfig, progressReceiver), () -> gui.onProjectChange(), Throwable::printStackTrace); }); }
private void loadProject() { Path file = Gui.requestFile("Select matches file", gui.getScene().getWindow(), getMatchesLoadExtensionFilters(), true); if (file == null) return; List<Path> paths = new ArrayList<>(); Dialog<List<Path>> dialog = new Dialog<>(); //dialog.initModality(Modality.APPLICATION_MODAL); dialog.setResizable(true); dialog.setTitle("Project paths"); dialog.getDialogPane().getButtonTypes().addAll(ButtonType.OK, ButtonType.CANCEL); Node okButton = dialog.getDialogPane().lookupButton(ButtonType.OK); dialog.getDialogPane().setContent(new LoadProjectPane(paths, dialog.getOwner(), okButton)); dialog.setResultConverter(button -> button == ButtonType.OK ? paths : null); dialog.showAndWait().ifPresent(newConfig -> { if (paths.isEmpty()) return; gui.getMatcher().reset(); gui.onProjectChange(); gui.runProgressTask("Initializing files...", progressReceiver -> gui.getMatcher().readMatches(file, paths, progressReceiver), () -> gui.onProjectChange(), Throwable::printStackTrace); }); }
/** * Constructor * * @param widget * The time graph widget to which this toolbar button is * associated. */ public ModelConfigButton(TimeGraphWidget widget) { Image icon = JfxImageFactory.instance().getImageFromResource(LEGEND_ICON_PATH); setGraphic(new ImageView(icon)); setTooltip(new Tooltip(Messages.modelConfigButtonName)); setOnAction(e -> { Dialog<?> dialog = new ModelConfigDialog(widget); dialog.show(); JfxUtils.centerDialogOnScreen(dialog, ModelConfigButton.this); }); }
/** * Constructor * * @param widget * The time graph widget to which this toolbar button is * associated. */ public DebugOptionsButton(TimeGraphWidget widget) { Image icon = JfxImageFactory.instance().getImageFromResource(CONFIG_ICON_PATH); setGraphic(new ImageView(icon)); setTooltip(new Tooltip(Messages.debugOptionsDialogName)); fOpts = widget.getDebugOptions(); setOnAction(e -> { Dialog<Void> dialog = new DebugOptionsDialog(this); dialog.show(); JfxUtils.centerDialogOnScreen(dialog, DebugOptionsButton.this); }); }
public Dialog<String[]> getDialog(ButtonType ok) { Dialog<String[]> dialog = new Dialog<String[]>(); dialog.setTitle(Values.MAIN_TITLE); dialog.setHeaderText(null); dialog.initModality(Modality.APPLICATION_MODAL); // 自定义确认和取消按钮 ButtonType cancel = new ButtonType(Values.CANCEL, ButtonData.CANCEL_CLOSE); dialog.getDialogPane().getButtonTypes().addAll(ok, cancel); return dialog; }
@FXML protected void uploadGame() { if (!new File(JGMRConfig.getInstance().getPath() + "/.jgmrlock.lock").exists()) { FileChooser directoryChooser = new FileChooser(); if (JGMRConfig.getInstance().getPath() != null) { directoryChooser.setInitialDirectory(new File(JGMRConfig.getInstance().getPath())); } Stage stage = new Stage(); File fileResult = directoryChooser.showOpenDialog(stage); if (fileResult != null) { Alert alert = new Alert(AlertType.CONFIRMATION); alert.setTitle("Upload to " + game.getName()); alert.setHeaderText("Upload to " + game.getName()); alert.setContentText("Are you sure you wish to upload " + fileResult.getName() + " to the game " + game.getName()); Optional<ButtonType> result = alert.showAndWait(); if (result.get() == ButtonType.OK) { uploadGame(fileResult); } } } else { Dialog dg = new Dialog(); dg.setContentText("An upload or download is already in progress, please wait for the previous operation to finish."); dg.setTitle("Download or Upload already in progress."); dg.getDialogPane().getButtonTypes().add(new ButtonType("Ok", ButtonBar.ButtonData.OK_DONE)); Platform.runLater(() -> { dg.showAndWait(); }); } }