Pagina 2 di 2 primaprima 1 2
Visualizzazione dei risultati da 11 a 16 su 16
  1. #11
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da fermat Visualizza il messaggio
    devo capire come applicarlo al mio caso.
    Ti assicuro che è più facile di quello che stai pensando.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  2. #12
    allora, ho provato a fare in questo modo.
    controller base:
    codice:
    public class ControllerAuthorEditor<T> {
    
        private ReadJson jsonRead;
        protected Stage stage;
    
        @FXML
        protected BorderPane aePane;
    
        @FXML
        public void initialize() {
            jsonRead = new ReadJson();
            TypeToken<List<T>> token = getToken();
            try {
                List<T> list = jsonRead.readJson(new File(UrlAndPath.JSON_AUTORI), token);
                ObservableList<T> oList = FXCollections.observableArrayList(list);
                oList = postRead(oList);
            } catch (IOException e) {
                GenericDialog.showDialog(e.getMessage(), Alert.AlertType.ERROR);
            }
        }
    
        protected TypeToken<List<T>> getToken() {
            return new TypeToken<List<T>>() {
            };
        }
    
        protected ObservableList<T> postRead(ObservableList<T> input) {
            return input;
        }
    
        protected Stage getStage() {
            stage = (Stage) aePane.getScene().getWindow();
            return stage;
        }
    
        @FXML
        protected void escPressed(KeyEvent event) {
            if (event.getCode() == KeyCode.ESCAPE) {
                getStage();
                stage.close();
            }
        }
    }
    controller che estende quello base:
    codice:
    public class ControllerAuthor extends ControllerAuthorEditor<Author> {
    
        @FXML
        private ComboBox<Author> comboAE;
    
        @Override
        protected TypeToken<List<Author>> getToken() {
            return new TypeToken<List<Author>>() {
            };
        }
    
        @Override
        protected ObservableList<Author> postRead(ObservableList<Author> input) {
            comboAE.setItems(input);
            comboAE.setCellFactory(new ComboListCell<Author>());
    
            return input;
        }
    }
    funzionare funziona.
    è anche corretto secondo te??

  3. #13
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Innanzitutto la implementazione di getToken in ControllerAuthorEditor ha poco senso. Come ho già detto, fare new TypeToken<List<T>>() {} è inutile, cioè non è un "default" valido. Sarebbe stato meglio obbligare le sottoclassi ad implementare il metodo.

    Poi non ho capito perché devi mettere il ComboBox e quei setItems e setCellFactory nella sottoclasse. Questi mi pare che puoi trattarli in modo "generico".

    Lo ripeto ancora: tutto quello che puoi trattare in modo generico senza dover sapere se sono Author o Editor, lo puoi mettere nella superclasse.
    Quello che devi fare sapendo esattamente se è Author o Editor (la creazione del TypeToken è un caso), lo devi fare nella sottoclasse dove hai fissato tu la parametrizzazione.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  4. #14
    ok, intendi una cosa del genere??

    codice:
    public abstract class ControllerAuthorEditor<T> {
    
        private ReadJson jsonRead;
        protected Stage stage;
    
        @FXML
        protected BorderPane aePane;
    
        @FXML
        private ComboBox<T> comboAE;
    
        @FXML
        public void initialize() {
            jsonRead = new ReadJson();
            TypeToken<List<T>> token = getToken();
            try {
                List<T> list = jsonRead.readJson(new File(UrlAndPath.JSON_AUTORI), token);
                ObservableList<T> oList = FXCollections.observableArrayList(list);
                oList = postRead(oList);
    
                comboAE.setItems(oList);
                comboAE.setCellFactory(new ComboListCell<T>());
            } catch (IOException e) {
                GenericDialog.showDialog(e.getMessage(), Alert.AlertType.ERROR);
            }
        }
    
        protected abstract TypeToken<List<T>> getToken();
    
        protected ObservableList<T> postRead(ObservableList<T> input) {
            return input;
        }
    
        protected Stage getStage() {
            stage = (Stage) aePane.getScene().getWindow();
            return stage;
        }
    
        @FXML
        protected void escPressed(KeyEvent event) {
            if (event.getCode() == KeyCode.ESCAPE) {
                getStage();
                stage.close();
            }
        }
    }
    e nella sottoclasse:
    codice:
    public class ControllerAuthor extends ControllerAuthorEditor<Author> {
    
        @Override
        protected TypeToken<List<Author>> getToken() {
            return new TypeToken<List<Author>>() {
            };
        }
    }

  5. #15
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da fermat Visualizza il messaggio
    ok, intendi una cosa del genere??
    Sì, esatto. Il getToken è un "obbligo" implementarlo nella sottoclasse (nella superclasse non avrebbe un default valido). Mentre invece postRead è un altro "punto di estensione" che però è facoltativo da ridefinire. Mettendolo hai solo tenuta "aperta" la possibilità di ridefinirlo. Noto anche che il postRead l'hai fatto basato su ObservableList invece che List. Va bene, cioè ... è una scelta.

    In futuro, visto che è tutto sotto il tuo controllo, potrai aggiungere altri "punti di estensione" come vorrai, se ce ne fosse bisogno.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  6. #16
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Sì, esatto. Il getToken è un "obbligo" implementarlo nella sottoclasse (nella superclasse non avrebbe un default valido). Mentre invece postRead è un altro "punto di estensione" che però è facoltativo da ridefinire. Mettendolo hai solo tenuta "aperta" la possibilità di ridefinirlo. Noto anche che il postRead l'hai fatto basato su ObservableList invece che List. Va bene, cioè ... è una scelta.

    In futuro, visto che è tutto sotto il tuo controllo, potrai aggiungere altri "punti di estensione" come vorrai, se ce ne fosse bisogno.
    ok perfetto.
    grazie mille per la super spiegazione!!!!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.