我认为你需要以不同的方式构建事物。看看这个例子和帮助。
它使用FileHooser获取要保存到的文件。从那里,根据文件类型运行两个任务之一。
package org.example;
import javafx.application.Application;
import javafx.concurrent.Task;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ProgressBar;
import javafx.scene.layout.VBox;
import javafx.stage.FileChooser;
import javafx.stage.FileChooser.ExtensionFilter;
import javafx.stage.Stage;
import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
public class App extends Application {
File saveFile;
Task<Void> saveToFileTask;
public static void main(String[] args) {
launch(args);
}
public void start(Stage primaryStage) {
primaryStage.setTitle("JavaFX WebView Example");
Button btnSave = new Button("Save");
Button btnCancel = new Button("Cancel");
btnCancel.setDisable(true);
ProgressBar progressBar = new ProgressBar();
progressBar.setVisible(false);
btnSave.setOnAction(actionEvent -> {
saveFile = saveToFile(primaryStage);
if(saveFile != null)
{
btnSave.setDisable(true);
btnCancel.setDisable(false);
progressBar.setVisible(true);
if(saveFile.getName().endsWith(".csv"))
{
saveToFileTask = writeCsvFile(saveFile);
}
else
{
saveToFileTask = writeTsvFile(saveFile);
}
saveToFileTask.setOnSucceeded(onSucceeded -> {
btnSave.setDisable(false);
btnCancel.setDisable(true);
progressBar.setVisible(false);
});
saveToFileTask.setOnCancelled(onCancelled -> {
btnSave.setDisable(false);
btnCancel.setDisable(true);
progressBar.setVisible(false);
});
progressBar.progressProperty().bind(saveToFileTask.progressProperty());
Thread thread = new Thread(saveToFileTask);
thread.setDaemon(true);
thread.start();
}
});
btnCancel.setOnAction(onAction -> {
saveToFileTask.cancel();
});
VBox root = new VBox(btnSave, btnCancel, progressBar);
Scene scene = new Scene(root, 960, 600);
primaryStage.setScene(scene);
primaryStage.show();
}
public File saveToFile(Stage stage)
{
FileChooser fileChooser = new FileChooser();
fileChooser.setTitle("Save");
fileChooser.getExtensionFilters().addAll(new ExtensionFilter("CSV file", "*.csv"), new ExtensionFilter("TSV file", "*.tsv"));
return fileChooser.showSaveDialog(stage);
}
public Task<Void> writeCsvFile(File file)
{
Task<Void> writeToCsvFile = new Task<Void>() {
@Override
protected Void call(){
StringBuilder stringBuilder = new StringBuilder();
//Do do this! Use a library!
for(int i = 1; i <= 100; i++)
{
stringBuilder.append(i).append(",");
if(i % 10 == 0)
{
stringBuilder.append(System.lineSeparator());
}
//help simulate a long task!
try
{
Thread.sleep(50);
}
catch (InterruptedException e)
{
throw new RuntimeException(e);
}
updateProgress(i, 100);
}
try
{
System.out.println(stringBuilder.toString());
Files.write(file.toPath(), stringBuilder.toString().getBytes(StandardCharsets.UTF_8));
}
catch (IOException e)
{
throw new RuntimeException(e);
}
return null;
}
};
return writeToCsvFile;
}
public Task<Void> writeTsvFile(File file)
{
Task<Void> writeToTsvFile = new Task<Void>() {
@Override
protected Void call(){
StringBuilder stringBuilder = new StringBuilder();
//Do do this! Use a library!
for(int i = 1; i <= 100; i++)
{
stringBuilder.append(i).append("\t");
if(i % 10 == 0)
{
stringBuilder.append(System.lineSeparator());
}
//help simulate a long task!
try
{
Thread.sleep(50);
}
catch (InterruptedException e)
{
throw new RuntimeException(e);
}
updateProgress(i, 100);
}
try
{
System.out.println(stringBuilder.toString());
Files.write(file.toPath(), stringBuilder.toString().getBytes(StandardCharsets.UTF_8));
}
catch (IOException e)
{
throw new RuntimeException(e);
}
return null;
}
};
return writeToTsvFile;
}
}