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:
in pratica, recupero la lista da database, e poi controllo quale item è stato cliccato.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 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??

Rispondi quotando