NOVINKA: Získej 40 hodin praktických dovedností s AI – ZDARMA ke každému akreditovanému kurzu!
S účinností od 26. 3. jsme aktualizovali Zásady zpracování osobních údajů – doplnili jsme informace o monitorování telefonických hovorů se zájemci o studium. Ostatní části zůstávají beze změn.
Avatar
dedek.vl
Člen
Avatar
dedek.vl:13.11.2019 18:32

Ahoj, potřebuji docílit posílání dat mezi stránkami aplikace. Zatím jsem to vždy řešil pomocí FXMLLoaderu nějak takto:

//ControllerJedna
FXMLLoader loader = new FXMLLoader(getClass().getResource("FXMLControllerDva.fxml"));
Parent parent = loader.load();
Stage stage = new Stage();
FXMLControllerDva controllerDva = loader.getController();
controllerDva.Data("data");
stage.seScene(new Scene(parent));
stage.show;


//ControllerDva
public void Data(String data){
String setData = data;
}

Ale teď potřebuji něco abych mohl posílat libovolné množství dat libovolného typu lze to nějak řešit pomocí OOP? Nebo jinak?

OOP ještě úplně nerozumím teprve se snažím pochopit jak to celé správně používat :-)

 
Odpovědět
13.11.2019 18:32
Avatar
Odpovídá na dedek.vl
Petr Štechmüller:13.11.2019 20:34

Ahoj, rovnou říkám, že tohle je čistě můj názor na věc a od ostatních se může lišit.

Tento problém jsem řešil u svých projektů až do doby, kdy mě to přestalo bavit a napsal jsem na to knihovn, pomocí které se mi zobrazují různé kontrolery s parametry, které si nastavím

Pokud je to nějaký menší projekt do šuplíku, tak si založíš nějakou sdílenou třídu (já to obvykle nazývám Service, kterou budeš injektovat do ostatních kontrolerů. V této Service si vytvoříš metody pro přepravu dat a budeš mít vystaráno.

Pokud jak říkáš teprve začínáš, může to celé znít dost náročně na tak "malý" problém. Podle mě je toto celkem zásadní věc a v nějakém větším systému, pokud se něco jako předávání parametrů navrhne špatně, jde celý systém do kytek.

Pokud něco není jasné, ptej se tady dál. Pokud ti zajde dostatečně daleko, hodím sem i tu knihovnu, pokud budeš mít zájem ;-)

Editováno 13.11.2019 20:35
Nahoru Odpovědět
13.11.2019 20:34
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Lubor Pešek
Člen
Avatar
Lubor Pešek:14.11.2019 13:44

V OOP se takovému přenosu dat říká přepravka (messenger) a je dost možné, že je to právě podobná knihovna, o které mluvil Petr Štechmüller.
Nejsem si jistý, jestli v FX existuje něco podobného, jako ve Springu Model. Zkus se podívat po tomhle.
Pokud by neexistovalo nic podobného, řešil bych to osobně předáváním Mapy Objektů, kde si pod nějakým klíčem předáš objekt a pak ho v dalším Stagy takto aplikuješ, ale je to dost kostrbaté řešení.
Co by se mě osobně líbilo a hlavně bys to mohl řešit skutečně objektově, tak bys mohl předávat nějaký property file, ve kterém bys právě takto předával tyto hodnoty. Určitě bys tím i zabezpečil a v mnohých případech i urychlil přenos.
Dejme tomu, že bys to ošetřil tak, že bys nemusel stejné hodnoty nikdy posílat víckrát.

Takže řešení je z mého pohledu několik.
Mapa objektů, Messenger (čili knihovna nebo klidně i nějaká support class, o které mluvil Petr), File transport nebo jestli přímo v FX existuje něco jako model, tak model.

Nahoru Odpovědět
14.11.2019 13:44
Existují dva způsoby, jak vyřešit problém. Za prvé vyhoďte počítač z okna. Za druhé vyhoďte okna z počítače.
Avatar
dedek.vl
Člen
Avatar
dedek.vl:14.11.2019 17:49

Ahoj, a díky za reakce. Ono bohužel malý problém časem vytvoří velký problém :-)

Tak jsem nad tím zase seděl par hodin a hledal a hledal a našel toto řešení:
Které je funkční a vypadá vcelku funkčně i na vetší projekt (teda alespoň myslím :D)

public class SampleController implements Initializable {

    @FXML
    private Pane pContent;

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        Service.getInstance().currentCountry().setCountry("Belgium");
        Service.getInstance().currentCountry().setPosition("Europe");
    }

    public void handleButtonAction(ActionEvent actionEvent) throws IOException {
        URL url = getClass().getResource("Sub1.fxml");
        FXMLLoader fxmlLoader = new FXMLLoader();
        fxmlLoader.setLocation(url);
        fxmlLoader.setBuilderFactory( new JavaFXBuilderFactory());
        pContent.getChildren().clear();
        pContent.getChildren().add((Node) fxmlLoader.load(url.openStream()));
    }
}

public class Sub1Controller implements Initializable {

    public Label lb2;
    public Label lb1;

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        lb1.setText(Service.getInstance().currentCountry().getCountry());
        lb2.setText(Service.getInstance().currentCountry().getPosition());
    }
}

public class Service {
    private final static Service instance = new Service();

    public static Service getInstance(){
        return instance;
    }

    private Country country = new Country();
    public Country currentCountry(){
        return country;
    }
}

public class Country {
    private SimpleStringProperty country = new SimpleStringProperty();
    private SimpleStringProperty position = new SimpleStringProperty();

    public String getPosition() {
        return position.get();
    }

    public void setPosition(String position) {
        this.position.set(position);
    }

    public void setCountry(String country) {
        this.country.set(country);
    }

    public String getCountry() {
        return country.get();
    }
}
 
Nahoru Odpovědět
14.11.2019 17:49
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 4 zpráv z 4.