如何在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");
}
}