如何在javaFX中使用FileeChooser创建新文件并将数据保存到文件中?

问题描述 投票:0回答:2

我需要通过对话框保存文件。对话框打开,但文件本身未保存,如何解决?代码:

    FileChooser fileChooser = new FileChooser();
    fileChooser.setTitle("Save");
    fileChooser.setInitialFileName("save file");
    fileChooser.getExtensionFilters().addAll(new FileChooser.ExtensionFilter("All Files", "*.*"));
    //Adding action on the menu item
    save.setOnAction(new EventHandler<ActionEvent>() {
        public void handle(ActionEvent event) {


            //Opening a dialog box
            fileChooser.getExtensionFilters()
                    .addAll(
                            new FileChooser.ExtensionFilter("TXT files (*.TXT)", "*.TXT"),
                            new FileChooser.ExtensionFilter("txt files (*.txt)", "*.txt")
                    );
            fileChooser.showSaveDialog(primaryStage);

        }
    });
java javafx
2个回答
0
投票

FileChooser中的过滤器仅用于显示现有文件。如果要保存具有特定扩展名的文件,则需要类似以下内容:

String fileName = file.toString();
if (!fileName.endsWith(".java"))
fileName += ".java";

0
投票

这是一个小示例,如果您要创建一个具有特定文件名(TextField),扩展名(ComboBox)和目标目录(DirectoryChooser)的新文件,]]

控制器类:

package sample;

import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.ComboBox;
import javafx.scene.control.TextField;
import javafx.stage.DirectoryChooser;

import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ResourceBundle;

public class Controller implements Initializable {

    @FXML
    private Button
            saveBtn;
    @FXML
    private TextField
            fileNameTextField,
            directoryTextField;
    @FXML
    private ComboBox<String>
            fileExtensionComboBox;

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        fileExtensionComboBox.getItems().addAll(".txt", ".json", ".xml");

        saveBtn.disableProperty().bind(fileNameTextField.textProperty().isEmpty()
                .or(fileExtensionComboBox.getSelectionModel().selectedItemProperty().isNull()
                        .or(directoryTextField.textProperty().isEmpty())));
    }

    @FXML
    public void handleChangeDirectoryBtnClick() {
        DirectoryChooser directoryChooser = new DirectoryChooser();
        File selectedDirectory = directoryChooser.showDialog(null);
        if (selectedDirectory != null) directoryTextField.setText(selectedDirectory.getAbsolutePath());
    }

    @FXML
    public void handleSaveBtnClick() {
        Path file = Paths.get(directoryTextField.getText(), fileNameTextField.getText().trim() + fileExtensionComboBox.getSelectionModel().getSelectedItem());
        if(!file.toFile().exists()) {
            System.out.println(file.toAbsolutePath());
            try {
                Files.createFile(file.toAbsolutePath());
                //...
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

FXML文件:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.ComboBox?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.RowConstraints?>

<GridPane hgap="3.0" vgap="3.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.Controller">
  <columnConstraints>
    <ColumnConstraints hgrow="SOMETIMES" />
      <ColumnConstraints hgrow="SOMETIMES" />
  </columnConstraints>
  <rowConstraints>
    <RowConstraints vgrow="SOMETIMES" />
      <RowConstraints vgrow="SOMETIMES" />
      <RowConstraints vgrow="SOMETIMES" />
      <RowConstraints vgrow="SOMETIMES" />
      <RowConstraints vgrow="SOMETIMES" />
  </rowConstraints>
   <children>
      <Label text="File Name:" />
      <TextField fx:id="fileNameTextField" GridPane.rowIndex="1" />
      <Label text="File Extension:" GridPane.columnIndex="1" />
      <ComboBox fx:id="fileExtensionComboBox" prefWidth="150.0" GridPane.columnIndex="1" GridPane.rowIndex="1" />
      <Label text="Directory:" GridPane.rowIndex="2" />
      <AnchorPane GridPane.columnSpan="2" GridPane.rowIndex="3">
         <children>
            <TextField fx:id="directoryTextField" editable="false" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="60.0" />
            <Button onAction="#handleChangeDirectoryBtnClick" text="Change" AnchorPane.rightAnchor="0.0" />
         </children>
      </AnchorPane>
      <HBox alignment="CENTER" GridPane.columnSpan="2" GridPane.rowIndex="4">
         <children>
            <Button fx:id="saveBtn" onAction="#handleSaveBtnClick" text="Save" />
         </children>
      </HBox>
   </children>
   <padding>
      <Insets bottom="3.0" left="3.0" right="3.0" top="3.0" />
   </padding>
</GridPane>

预览:

preview

© www.soinside.com 2019 - 2024. All rights reserved.