类javafx.scene.control.TextInputDialog源码实例Demo

下面列出了怎么用javafx.scene.control.TextInputDialog的API类实例代码及写法,或者点击链接到github查看源代码。

源代码1 项目: constellation   文件: JsonIODialog.java
/**
 * Displays a small window allowing the user to enter a name for the new
 * preference
 *
 * @author formalhaut69
 * @return A tuple, the first item is a Boolean indicating whether the user
 * selected to proceed with the operation or not, the second is the name of
 * the file requested by the user.
 */
public static Tuple<Boolean, String> getName() {
    String returnedName = "";

    // opens up a slightly different dialog window to allow the user to name the
    // preference when it is being saved
    // create a text input dialog 
    TextInputDialog td = new TextInputDialog();
    td.setTitle("Preference name");
    // setHeaderText 
    td.setHeaderText("Enter a name for the preference");
    Optional<String> result = td.showAndWait();
    if (result.isPresent()) {
        returnedName = td.getEditor().getText();
    }
    return new Tuple<>(result.isPresent(), returnedName);
}
 
源代码2 项目: Open-Lowcode   文件: ClientDisplay.java
/**
 * @param title      null if user pressed cancel, or the text entered if pressed
 *                   OK (if pressed OK with no text entered, empty string is
 *                   brought back
 * @param textlength the maximum length of text to enter
 * @return
 */
public String showModalTextEntry(String title, int textlength) {
	logger.fine("NormalTextEntry " + title + " - " + textlength);

	logger.fine(" prepare to launch dialog");
	TextInputDialog dialog = new TextInputDialog();

	dialog.setHeaderText("Enter Update Note below");
	dialog.setContentText("");

	Optional<String> result = dialog.showAndWait();
	logger.fine(" dialog is displayed");

	if (!result.isPresent())
		return null;
	return result.get();

}
 
源代码3 项目: BlockMap   文件: GuiController.java
@FXML
public void showUrlDialog() {
	TextInputDialog dialog = new TextInputDialog();
	dialog.setTitle("Load remote world");
	dialog.setHeaderText("Enter the URL to the remote world you want to load");
	dialog.setGraphic(null);
	dialog.setResult(serverSettingsController.lastBrowsedURL);
	dialog.showAndWait().ifPresent(s -> {
		try {
			loadRemote(new URI(s));
			serverSettingsController.lastBrowsedURL = s;
			worldInput.setText(s);
		} catch (URISyntaxException | IllegalArgumentException e) {
			log.warn("Malformed input uri", e);
			ExceptionDialog d = new ExceptionDialog(e);
			d.setTitle("Malformed input");
			d.showAndWait();
		}
	});
}
 
源代码4 项目: tcMenu   文件: ArduinoLibraryInstaller.java
/**
 * This method will be called internally by the above method when a non standard layout is detected.
 *
 * @return the arduino path wrapped in an optional, or nothing if cancel is pressed.
 */
private Optional<String> getArduinoPathWithDialog() {
    String savedPath = Preferences.userNodeForPackage(ArduinoLibraryInstaller.class)
            .get(ARDUINO_CUSTOM_PATH, homeDirectory);

    Path libsPath = Paths.get(savedPath, "libraries");
    if (Files.exists(libsPath)) return Optional.of(savedPath);

    TextInputDialog dialog = new TextInputDialog(savedPath);
    dialog.setTitle("Manually enter Arduino Path");
    dialog.setHeaderText("Please manually enter the full path to the Arduino folder");
    dialog.setContentText("Arduino Path");
    Optional<String> path = dialog.showAndWait();
    path.ifPresent((p) -> Preferences.userNodeForPackage(ArduinoLibraryInstaller.class).put(ARDUINO_CUSTOM_PATH, p));
    return path;
}
 
源代码5 项目: Quelea   文件: AddWebActionHandler.java
@Override
public void handle(ActionEvent t) {
    TextInputDialog dialog = new TextInputDialog("http://");
    dialog.setTitle(LabelGrabber.INSTANCE.getLabel("website.dialog.title"));
    dialog.setHeaderText(LabelGrabber.INSTANCE.getLabel("website.dialog.header"));
    dialog.setContentText(LabelGrabber.INSTANCE.getLabel("website.dialog.content"));
    dialog.setGraphic(new ImageView(new Image("file:icons/website.png")));
    Stage stage = (Stage) dialog.getDialogPane().getScene().getWindow();
    stage.getIcons().add(new Image("file:icons/web-small.png"));

    Optional<String> result = dialog.showAndWait();
    if (result.isPresent()) {
        String url = result.get();
        if (!url.startsWith("http")) {
            url = "http://" + url;
        }
        WebDisplayable displayable = new WebDisplayable(url);
        QueleaApp.get().getMainWindow().getMainPanel().getSchedulePanel().getScheduleList().add(displayable);
    }
}
 
源代码6 项目: MyBox   文件: MediaTableController.java
@FXML
public void addLinkAction() {
    try {
        // http://ivi.bupt.edu.cn/hls/cctv1hd.m3u8
        TextInputDialog dialog = new TextInputDialog("http://devimages.apple.com/iphone/samples/bipbop/gear1/prog_index.m3u8");
        dialog.setTitle(message("HTTPLiveStreaming"));
        dialog.setHeaderText(message("InputAddress"));
        dialog.setContentText("HLS(.m3u8)");
        dialog.getEditor().setPrefWidth(500);
        Stage stage = (Stage) dialog.getDialogPane().getScene().getWindow();
        stage.setAlwaysOnTop(true);
        stage.toFront();

        Optional<String> result = dialog.showAndWait();
        if (!result.isPresent()) {
            return;
        }
        String address = result.get();
        addLink(address);

    } catch (Exception e) {
        logger.error(e.toString());
    }

}
 
源代码7 项目: MyBox   文件: DownloadController.java
@FXML
protected void plusAction() {
    try {
        TextInputDialog dialog = new TextInputDialog("https://");
        dialog.setTitle(message("DownloadManage"));
        dialog.setHeaderText(message("InputAddress"));
        dialog.setContentText("");
        dialog.getEditor().setPrefWidth(500);
        Stage stage = (Stage) dialog.getDialogPane().getScene().getWindow();
        stage.setAlwaysOnTop(true);
        stage.toFront();
        Optional<String> result = dialog.showAndWait();
        if (!result.isPresent()) {
            return;
        }
        String address = result.get();
        download(address);

    } catch (Exception e) {
        logger.error(e.toString());
    }
}
 
源代码8 项目: MyBox   文件: MyBoxLanguagesController.java
@FXML
public void plusAction() {
    TextInputDialog dialog = new TextInputDialog("");
    dialog.setTitle(message("ManageLanguages"));
    dialog.setHeaderText(message("InputLangaugeName"));
    dialog.setContentText("");
    dialog.getEditor().setPrefWidth(200);
    Stage stage = (Stage) dialog.getDialogPane().getScene().getWindow();
    stage.setAlwaysOnTop(true);
    stage.toFront();

    Optional<String> result = dialog.showAndWait();
    if (!result.isPresent() || result.get().trim().isBlank()) {
        return;
    }
    langName = result.get().trim();
    langLabel.setText(langName);
    loadLanguage(null);
}
 
源代码9 项目: phoebus   文件: FindWidgetAction.java
/** @param node Node to position dialog
 *  @param editor Editor in which to select widgets
 */
public FindWidgetAction(final Node node, final DisplayEditor editor)
{
    super(Messages.FindWidget, ImageCache.getImageView(DisplayEditor.class, "/icons/search.png"));
    setOnAction(event ->
    {
        // Prompt for widget name
        final TextInputDialog prompt = new TextInputDialog();
        prompt.setTitle(Messages.FindWidget);
        prompt.setHeaderText("Enter (partial) widget name");
        prompt.setResizable(true);
        DialogHelper.positionAndSize(prompt, node,
                PhoebusPreferenceService.userNodeForClass(FindWidgetAction.class));
        final String pattern = prompt.showAndWait().orElse(null);
        if (pattern != null  &&  !pattern.isEmpty())
            editor.selectWidgetsByName(pattern);
    });
}
 
源代码10 项目: phoebus   文件: RenameAction.java
/** @param node Node used to position confirmation dialog
 *  @param item Item to rename
 */
public RenameAction(final Node node, final TreeItem<FileInfo> item)
{
    super(Messages.Rename, ImageCache.getImageView(ImageCache.class, "/icons/name.png"));

    setOnAction(event ->
    {
        final File file = item.getValue().file;
        final TextInputDialog prompt = new TextInputDialog(file.getName());
        prompt.setTitle(getText());
        prompt.setHeaderText(Messages.RenameHdr);
        DialogHelper.positionDialog(prompt, node, 0, 0);
        final String new_name = prompt.showAndWait().orElse(null);
        if (new_name == null)
            return;

        JobManager.schedule(Messages.RenameJobName + item.getValue(), monitor ->
        {
            Files.move(file.toPath(), (new File(file.getParentFile(), new_name)).toPath(), StandardCopyOption.REPLACE_EXISTING);

            final FileTreeItem parent = (FileTreeItem)item.getParent();
            Platform.runLater(() ->  parent.forceRefresh());
        });
    });
}
 
源代码11 项目: megan-ce   文件: Dialogs.java
/**
 * show an input dialog
 *
 * @param swingParent
 * @param title
 * @param message
 * @param initialValue
 * @return
 */
private static String showInput(final Component swingParent, final String title, final String message, final String initialValue) {
    final Single<String> input = new Single<>(null);

    if (Platform.isFxApplicationThread()) {
        final TextInputDialog dialog = new TextInputDialog(initialValue != null ? initialValue : "");
        dialog.setTitle(title);
        dialog.setHeaderText(message);

        final Optional<String> result = dialog.showAndWait();
        result.ifPresent(input::set);

    } else if (javax.swing.SwingUtilities.isEventDispatchThread()) {
        input.set(JOptionPane.showInputDialog(swingParent, message, initialValue));
    } else {
        try {
            SwingUtilities.invokeAndWait(() -> input.set(showInput(swingParent, title, message, initialValue)));
        } catch (Exception e) {
            Basic.caught(e);
        }
    }
    return input.get();
}
 
源代码12 项目: megan-ce   文件: NewAttributeCommand.java
public void actionPerformed(ActionEvent event) {
    final SamplesViewer viewer = ((SamplesViewer) getViewer());
    final int index;
    final String selectedAttribute = viewer.getSamplesTableView().getASelectedAttribute();
    if (selectedAttribute != null)
        index = viewer.getSamplesTableView().getAttributes().indexOf(selectedAttribute);
    else
        index = viewer.getSamplesTableView().getSampleCount();

    String name = null;
    if (Platform.isFxApplicationThread()) {
        TextInputDialog dialog = new TextInputDialog("Attribute");
        dialog.setTitle("New attribute");
        dialog.setHeaderText("Enter attribute name:");

        Optional<String> result = dialog.showAndWait();
        if (result.isPresent()) {
            name = result.get().trim();
        }
    } else if (javax.swing.SwingUtilities.isEventDispatchThread()) {
        name = JOptionPane.showInputDialog(getViewer().getFrame(), "Enter new attribute name", "Untitled");
    }

    if (name != null)
        executeImmediately("new attribute='" + name + "' position=" + index + ";");
}
 
public void handleSetMzShiftManually(Event event) {
  DecimalFormat mzFormat = MZmineCore.getConfiguration().getMZFormat();
  String newMzShiftString = "0.0";
  Double newMzShift = (Double) setToMenuItem.getUserData();
  if (newMzShift != null)
    newMzShiftString = mzFormat.format(newMzShift);
  TextInputDialog dialog = new TextInputDialog(newMzShiftString);
  dialog.setTitle("m/z shift");
  dialog.setHeaderText("Set m/z shift value");
  Optional<String> result = dialog.showAndWait();
  result.ifPresent(value -> {
    try {
      double newValue = Double.parseDouble(value);
      mzShift.set(newValue);
    } catch (Exception e) {
      e.printStackTrace();
    }
  });

}
 
源代码14 项目: jace   文件: Program.java
public void initEditor(WebView editor, File sourceFile, boolean isBlank) {
    this.editor = editor;
    targetFile = sourceFile;
    if (targetFile != null) {
        filename = targetFile.getName();
    }

    editor.getEngine().getLoadWorker().stateProperty().addListener(
            (value, old, newState) -> {
                if (newState == Worker.State.SUCCEEDED) {
                    JSObject document = (JSObject) editor.getEngine().executeScript("window");
                    document.setMember("java", this);
                    Platform.runLater(()->createEditor(isBlank));
                }
            });

    editor.getEngine().setPromptHandler((PromptData prompt) -> {
        TextInputDialog dialog = new TextInputDialog(prompt.getDefaultValue());
        dialog.setTitle("Jace IDE");
        dialog.setHeaderText("Respond and press OK, or Cancel to abort");
        dialog.setContentText(prompt.getMessage());
        return dialog.showAndWait().orElse(null);
    });

    editor.getEngine().load(getClass().getResource(CODEMIRROR_EDITOR).toExternalForm());
}
 
源代码15 项目: PeerWasp   文件: Network.java
@FXML
public void editAction(ActionEvent event) {
	// load current selection and allow user to change value
	int index = lwBootstrappingNodes.getSelectionModel().getSelectedIndex();
	String nodeAddress = lwBootstrappingNodes.getSelectionModel().getSelectedItem();

	TextInputDialog input = new TextInputDialog();
	DialogUtils.decorateDialogWithIcon(input);
	input.getEditor().setText(nodeAddress);
	input.setTitle("Edit Node Address");
	input.setHeaderText("Enter node address");
	Optional<String> result = input.showAndWait();

	if(result.isPresent()) {
		String newNodeAddress = result.get().trim();
		if (!newNodeAddress.isEmpty() && !containsAddress(newNodeAddress)) {
			addresses.add(index, newNodeAddress);
			addresses.remove(nodeAddress);
		}
	}
}
 
源代码16 项目: MyBox   文件: MediaListController.java
@FXML
@Override
public void saveAsAction() {
    MediaList selected = tableView.getSelectionModel().getSelectedItem();
    if (selected == null || selected.getMedias() == null) {
        return;
    }
    TextInputDialog dialog = new TextInputDialog("");
    dialog.setTitle(message("ManageMediaLists"));
    dialog.setHeaderText(message("InputMediaListName"));
    dialog.setContentText("");
    dialog.getEditor().setPrefWidth(400);
    Stage stage = (Stage) dialog.getDialogPane().getScene().getWindow();
    stage.setAlwaysOnTop(true);
    stage.toFront();
    Optional<String> result = dialog.showAndWait();
    if (!result.isPresent() || result.get().trim().isBlank()) {
        return;
    }
    String newName = result.get().trim();
    for (MediaList list : tableData) {
        if (list.getName().equals(newName)) {
            popError(message("AlreadyExisted"));
            return;
        }
    }
    if (TableMediaList.set(newName, selected.getMedias())) {
        popSuccessful();
        tableData.add(MediaList.create().setName(newName).setMedias(selected.getMedias()));
    } else {
        popFailed();
    }

}
 
源代码17 项目: MyBox   文件: MediaTableController.java
@FXML
@Override
public void saveAction() {
    if (mediaListName == null || mediaListName.isBlank()) {
        if (tableData.isEmpty()) {
            tableLabel.setText("");
            return;
        }
        TextInputDialog dialog = new TextInputDialog("");
        dialog.setTitle(message("ManageMediaLists"));
        dialog.setHeaderText(message("InputMediaListName"));
        dialog.setContentText("");
        dialog.getEditor().setPrefWidth(400);
        Stage stage = (Stage) dialog.getDialogPane().getScene().getWindow();
        stage.setAlwaysOnTop(true);
        stage.toFront();

        Optional<String> result = dialog.showAndWait();
        if (!result.isPresent() || result.get().trim().isBlank()) {
            return;
        }
        mediaListName = result.get().trim();
    }
    if (TableMediaList.set(mediaListName, tableData)) {
        tableLabel.setText(message("MediaList") + ": " + mediaListName);
        if (parentController != null) {
            parentController.popSuccessful();
            if (parentController instanceof MediaListController) {
                ((MediaListController) parentController).update(mediaListName);
            }
        }
    } else {
        if (parentController != null) {
            parentController.popFailed();
        }
    }
}
 
源代码18 项目: marathonv5   文件: CheckListView.java
public void onHeader() {
    TextInputDialog input = new TextInputDialog();
    input.setTitle("New Header");
    input.setContentText("Label: ");
    input.setHeaderText("Please enter header text.");
    Optional<String> result = input.showAndWait();
    result.ifPresent(name -> {
        checkListFormNode.addHeader(name);
        fireContentChanged();
    });
}
 
源代码19 项目: marathonv5   文件: CheckListView.java
public void onChecklist() {
    TextInputDialog input = new TextInputDialog();
    input.setTitle("New Checklist Item");
    input.setContentText("Label: ");
    input.setHeaderText("Please enter item label.");
    Optional<String> result = input.showAndWait();
    result.ifPresent(name -> {
        checkListFormNode.addCheckListItem(name);
        fireContentChanged();
    });
}
 
源代码20 项目: marathonv5   文件: CheckListView.java
public void onTextArea() {
    TextInputDialog input = new TextInputDialog();
    input.setTitle("New Textbox");
    input.setContentText("Label: ");
    input.setHeaderText("Please enter text box label.");
    Optional<String> result = input.showAndWait();
    result.ifPresent(name -> {
        checkListFormNode.addTextArea(name);
        fireContentChanged();
    });
}
 
源代码21 项目: java-ml-projects   文件: AppUtils.java
public static Optional<String> askInputFromUser(String title, String msg) {
	TextInputDialog dialog = new TextInputDialog();
	dialog.setTitle(title);
	dialog.setHeaderText(null);
	dialog.setContentText(msg);
	return dialog.showAndWait();
}
 
源代码22 项目: java-ml-projects   文件: AppUtils.java
public static Optional<String> askInputFromUser(String title, String msg) {
	TextInputDialog dialog = new TextInputDialog();
	dialog.setTitle(title);
	dialog.setHeaderText(null);
	dialog.setContentText(msg);
	return dialog.showAndWait();
}
 
源代码23 项目: phoebus   文件: DuplicatePVAction.java
/** @param node Node to position dialog
 *  @param model Model where new component is added
 *  @param parent Parent item in alarm tree
 */
public DuplicatePVAction(final Node node, final AlarmClient model, final AlarmClientLeaf original)
{
    super("Duplicate PV", ImageCache.getImageView(AlarmSystem.class, "/icons/move.png"));
    setOnAction(event ->
    {
        // Prompt for new PV name
        final TextInputDialog dialog = new TextInputDialog();
        dialog.setTitle(getText());
        dialog.setHeaderText("Enter name for duplicate of\n" + original.getPathName());
        DialogHelper.positionDialog(dialog, node, -100, -50);
        final String new_name = dialog.showAndWait().orElse(null);
        if (new_name == null  ||  new_name.isEmpty())
            return;

        // Create near copy of original PV, but with new name
        final AlarmClientLeaf template = new AlarmClientLeaf(null, new_name);
        template.setDescription(original.getDescription());
        template.setEnabled(original.isEnabled());
        template.setLatching(original.isLatching());
        template.setAnnunciating(original.isAnnunciating());
        template.setDelay(original.getDelay());
        template.setCount(original.getCount());
        template.setFilter(original.getFilter());
        template.setGuidance(original.getGuidance());
        template.setDisplays(original.getDisplays());
        template.setCommands(original.getCommands());
        template.setActions(original.getActions());

        // Request adding new PV
        final String new_path = AlarmTreePath.makePath(original.getParent().getPathName(), new_name);
        JobManager.schedule(getText(), monitor -> model.sendItemConfigurationUpdate(new_path, template));
    });
}
 
源代码24 项目: phoebus   文件: NamePaneMenuItem.java
/** Edit name of dock pane */
private void editName(final DockPane pane)
{
    final TextInputDialog dialog = new TextInputDialog(pane.getName());
    dialog.setTitle(Messages.NamePane);
    dialog.setHeaderText(Messages.NamePaneHdr);
    DialogHelper.positionDialog(dialog, pane, -200, -100);
    dialog.showAndWait().ifPresent(pane::setName);
}
 
源代码25 项目: phoebus   文件: SaveLayoutMenuItem.java
/** Save the layout. Prompt for a new filename, validate, possibly confirm an overwrite, and then save.
 *  @return <code>true</code> if layout save has been initiated (may take some time to complete)
 */
private boolean saveLayout()
{
    final TextInputDialog prompt = new TextInputDialog();
    prompt.setTitle(getText());
    prompt.setHeaderText(Messages.SaveDlgHdr);
    positionDialog(prompt);

    while (true)
    {
        final String filename = prompt.showAndWait().orElse(null);

        // Canceled?
        if (filename == null)
            return false;
        // OK to save?
        if (! validateFilename(filename))
        {
            // Ask again
            prompt.setHeaderText(Messages.SaveDlgErrHdr);
            continue;
        }
        else
            prompt.setHeaderText(Messages.SaveDlgHdr);

        // Done if save succeeded.
        if (saveState(filename))
            return true;
    }
}
 
源代码26 项目: phoebus   文件: StringTable.java
/** Prompt for column name
 *  @param name Suggested name
 *  @return Name entered by user or <code>null</code>
 */
private String getColumnName(final String name)
{
    final TextInputDialog dialog = new TextInputDialog(name);
    // Position dialog near table
    final Bounds absolute = localToScreen(getBoundsInLocal());
    dialog.setX(absolute.getMinX() + 10);
    dialog.setY(absolute.getMinY() + 10);
    dialog.setTitle(Messages.RenameColumnTitle);
    dialog.setHeaderText(Messages.RenameColumnInfo);
    return dialog.showAndWait().orElse(null);
}
 
源代码27 项目: qiniu   文件: DialogUtils.java
public static String showInputDialog(String header, String content, String defaultValue) {
    TextInputDialog dialog = new TextInputDialog(defaultValue);
    dialog.setTitle(QiniuValueConsts.MAIN_TITLE);
    dialog.setHeaderText(header);
    dialog.setContentText(content);
    Optional<String> result = dialog.showAndWait();
    return result.orElse(null);
}
 
源代码28 项目: megan-ce   文件: RenameSampleCommand.java
public void actionPerformed(ActionEvent event) {
    SamplesViewer viewer = (SamplesViewer) getViewer();
    String sampleName = viewer.getSamplesTableView().getASelectedSample();
    String newName = null;
    if (Platform.isFxApplicationThread()) {
        TextInputDialog dialog = new TextInputDialog(sampleName);
        dialog.setTitle("Rename sample");
        dialog.setHeaderText("Enter new sample name:");

        Optional<String> result = dialog.showAndWait();
        if (result.isPresent()) {
            newName = result.get().trim();
        }
    } else if (javax.swing.SwingUtilities.isEventDispatchThread()) {
        newName = JOptionPane.showInputDialog(getViewer().getFrame(), "Enter new sample name", sampleName);
    }

    if (newName != null && !newName.equals(sampleName)) {
        if (viewer.getSampleAttributeTable().getSampleOrder().contains(newName)) {
            int count = 1;
            while (viewer.getSampleAttributeTable().getSampleOrder().contains(newName + "." + count))
                count++;
            newName += "." + count;
        }
        execute("rename sample='" + sampleName + "' newName='" + newName + "';" +
                "labelBy attribute='" + SampleAttributeTable.SAMPLE_ID + "'  samples=all;");
    }
}
 
源代码29 项目: BowlerStudio   文件: NewVitaminWizardController.java
@FXML
  void onNewMeasurment(ActionEvent event) {
newMeasurmentButton.setDisable(true);
TextInputDialog dialog = new TextInputDialog("lengthOfThing");
dialog.setTitle("Add new measurment to "+typeOfVitaminString);
dialog.setHeaderText("This measurment will be added to all instances of the vitamin");
dialog.setContentText("New measurment name:");

// Traditional way to get the response value.
Optional<String> result = dialog.showAndWait();
// The Java 8 way to get the response value (with lambda expression).
result.ifPresent(name -> { 
	TextInputDialog dialog2 = new TextInputDialog("0.0");
	dialog2.setTitle("Set value of "+name);
	dialog2.setHeaderText("This value will be added to all instances of the vitamin");
	dialog2.setContentText(name+" = ");

	// Traditional way to get the response value.
	Optional<String> result2 = dialog2.showAndWait();
	result2.ifPresent(name2 -> { 
		setupKeyValueToTable(name,name2,sizeOfVitaminString);
		for(String size:Vitamins.listVitaminSizes(typeOfVitaminString)) {
			Vitamins.getConfiguration(typeOfVitaminString, size).put(name,name2);
		}
	});
	newMeasurmentButton.setDisable(false);
	
});


  }
 
源代码30 项目: old-mzmine3   文件: FeatureTableColumnsEditor.java
public FeatureTableColumnsEditor(PropertySheet.Item parameter) {

    // HBox properties
    setSpacing(10);
    setAlignment(Pos.CENTER_LEFT);

    namePatternList = new ListView<>();
    namePatternList.setEditable(true);
    namePatternList.setPrefHeight(150);
    namePatternList.setCellFactory(TextFieldListCell.forListView());

    Button addButton = new Button("Add");
    addButton.setOnAction(e -> {
      TextInputDialog dialog = new TextInputDialog();
      dialog.setTitle("Add name pattern");
      dialog.setHeaderText("New name pattern");
      Optional<String> result = dialog.showAndWait();
      result.ifPresent(value -> namePatternList.getItems().add(value));
    });

    Button removeButton = new Button("Remove");
    removeButton.setOnAction(e -> {
      List<String> selectedItems = namePatternList.getSelectionModel().getSelectedItems();
      namePatternList.getItems().removeAll(selectedItems);
    });

    VBox buttons = new VBox(addButton, removeButton);
    buttons.setSpacing(10);

    getChildren().addAll(namePatternList, buttons);
  }
 
 类所在包
 同包方法