ciao!
vorrei migliorare un pò questo codice.
partiamo dal FileChooser:
codice:
public class DirChooser {
private File lastDir;
public DirChooser() {
lastDir = new File(System.getProperty("user.home"));
}
public Optional<String> saveFile(Window ownerWindow, String title, FileChooser.ExtensionFilter ext) {
FileChooser chooser = new FileChooser();
chooser.setTitle(title);
chooser.setInitialDirectory(lastDir);
chooser.getExtensionFilters().add(ext);
File file = chooser.showSaveDialog(ownerWindow);
if (file != null) {
return Optional.of(file.getPath());
} else {
return Optional.empty();
}
}
}
poi nel mio controller ho vari MenuItem per vari tipi di esportazione dati (json,xls,xlm,csv).
tutti richiamano lo stesso metodo, che fa una sorta di "dispatch".
a seconda dell'item selezionato, richiama il chooser e poi la classe preposta all'export:
codice:
@FXML
private MenuItem miCsv;
@FXML
private MenuItem miXls;
@FXML
private MenuItem miXml;
@FXML
private void esporta(ActionEvent ev) {
Object obj = ev.getSource();
List<Nota> list = null;
try {
list = db.getAll();
} catch (SQLException ex) {
GenericDialog.showDialog("Errore database: " + ex.getMessage(), Alert.AlertType.WARNING);
}
if (list != null) {
DirChooser dc = new DirChooser();
Optional<String> f;
if (obj == miJson) {
f = dc.saveFile(getStage().getOwner(), "Esporta JSON", new FileChooser.ExtensionFilter("JSON (*.json)", "*.json"));
if (f.isPresent()) {
try {
JsonDb jd = new JsonDb();
jd.create(f.get(), list);
GenericDialog.showDialog("Database esportato!", Alert.AlertType.INFORMATION);
} catch (IOException ex) {
GenericDialog.showDialog(ex.getMessage(), Alert.AlertType.WARNING);
}
}
} else if (obj == miXls) {
f = dc.saveFile(getStage().getOwner(), "Esporta XLS", new FileChooser.ExtensionFilter("XLS (*.xls)", "*.xls"));
if (f.isPresent()) {
try {
ExcelDb ed = new ExcelDb();
ed.create(f.get(), tblCaption, list);
GenericDialog.showDialog("Database esportato!", Alert.AlertType.INFORMATION);
} catch (IOException | WriteException ex) {
GenericDialog.showDialog(ex.getMessage(), Alert.AlertType.WARNING);
}
}
} else if (obj == miCsv) {
f = dc.saveFile(getStage().getOwner(), "Esporta CSV", new FileChooser.ExtensionFilter("CSV (*.csv)", "*.csv"));
if (f.isPresent()) {
try {
CsvDb cd = new CsvDb();
cd.create(f.get(), tblCaption, list);
GenericDialog.showDialog("Database esportato!", Alert.AlertType.INFORMATION);
} catch (IOException ex) {
GenericDialog.showDialog(ex.getMessage(), Alert.AlertType.WARNING);
}
}
} else if (obj == miXml) {
f = dc.saveFile(getStage().getOwner(), "Esporta XML", new FileChooser.ExtensionFilter("XML (*.XML)", "*.XML"));
if (f.isPresent()) {
try {
XmlDb xd = new XmlDb();
xd.create(f.get(), list);
GenericDialog.showDialog("Database esportato!", Alert.AlertType.INFORMATION);
} catch (ParserConfigurationException | TransformerException ex) {
GenericDialog.showDialog(ex.getMessage(), Alert.AlertType.WARNING);
}
}
}
}
}
in pratica, recupero la lista da database, e poi controllo quale item è stato cliccato.
in base a quello imposto i parametri del chooser, e richiamo la classe per l'export.
ma tutti questi if/else non mi piacciono.
secondo voi dove posso intervenire??