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

如何在javaFX中使用FileeChooser创建新文件并将数据保存在文件中?,java,javafx,Java,Javafx,我需要通过对话框保存文件。对话框打开但文件本身未保存,如何修复? 代码: FileChooser FileChooser=newfilechooser(); fileChooser.setTitle(“保存”); setInitialFileName(“保存文件”); fileChooser.getExtensionFilters().addAll(新的fileChooser.ExtensionFilter(“所有文件”,“*”)); //在菜单项上添加操作 save.setOnAction(新

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

FileChooser FileChooser=newfilechooser();
fileChooser.setTitle(“保存”);
setInitialFileName(“保存文件”);
fileChooser.getExtensionFilters().addAll(新的fileChooser.ExtensionFilter(“所有文件”,“*”));
//在菜单项上添加操作
save.setOnAction(新的EventHandler(){
公共无效句柄(ActionEvent事件){
//打开对话框
fileChooser.getExtensionFilters()
阿道尔先生(
新建FileChooser.ExtensionFilter(“TXT文件(*.TXT)”,“*.TXT”),
新建FileChooser.ExtensionFilter(“txt文件(*.txt)”,“*.txt”)
);
fileChooser.showSaveDialog(primaryStage);
}
});

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

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

如果要创建具有特定文件名(
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(!Files.exists(file)) { {
            try {
                Files.createFile(file.toAbsolutePath());
                //...
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
包装样品;
导入javafx.fxml.fxml;
导入javafx.fxml.Initializable;
导入javafx.scene.control.Button;
导入javafx.scene.control.ComboBox;
导入javafx.scene.control.TextField;
导入javafx.stage.DirectoryChooser;
导入java.io.File;
导入java.io.IOException;
导入java.net.URL;
导入java.nio.file.Files;
导入java.nio.file.Path;
导入java.nio.file.path;
导入java.util.ResourceBundle;
公共类控制器实现可初始化{
@FXML
专用按钮
saveBtn;
@FXML
专用文本字段
fileNameTextField,
目录文本字段;
@FXML
专用组合框
文件扩展mbobox;
@凌驾
公共void初始化(URL位置、ResourceBundle资源){
fileExtensionComboBox.getItems().addAll(“.txt”、“.json”、“.xml”);
saveBtn.disableProperty().bind(fileNameTextField.textProperty().isEmpty())
.或(fileExtensionComboBox.getSelectionModel().selectedItemProperty().isNull()
.或(directoryTextField.textProperty().isEmpty());
}
@FXML
public void handlechange directorybtclick(){
DirectoryChooser DirectoryChooser=新的DirectoryChooser();
文件selectedDirectory=directoryChooser.showDialog(null);
if(selectedDirectory!=null)directoryTextField.setText(selectedDirectory.getAbsolutePath());
}
@FXML
public void handleSaveBtnClick(){
路径文件=路径.get(directoryTextField.getText(),fileNameTextField.getText().trim()+文件扩展mbobox.getSelectionModel().getSelectedItem());
如果(!Files.exists(file)){{
试一试{
Files.createFile(file.toabsolutionPath());
//...
}捕获(IOE异常){
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>


文件选择器
不会在存储设备上创建文件,也不会修改文件(如果存在)

这只是一种获得用户通过保存对话框确定的
文件
实例的方法。用户选择文件后,您需要自己保存数据:

File selectedFile = fileChooser.showSaveDialog(primaryStage);
if (selectedFile != null) {
    // dialog closed by selecting a file to save the data to

    // write data here yourself, e.g.
    try (BufferedReader br = Files.newBufferedReader(selectedFile.toPath(), StandardCharsets.UTF_8)) {
        br.write("Hello World!\n");
    }
}

如果写入文件可能需要很长时间,您应该将写入逻辑移到后台线程,以避免冻结GUI。

获取
showsavedilog
返回的
文件
对象,然后,如果该对象不为空,则写入它(例如,使用
java.io
API)。
File selectedFile = fileChooser.showSaveDialog(primaryStage);
if (selectedFile != null) {
    // dialog closed by selecting a file to save the data to

    // write data here yourself, e.g.
    try (BufferedReader br = Files.newBufferedReader(selectedFile.toPath(), StandardCharsets.UTF_8)) {
        br.write("Hello World!\n");
    }
}