Diskuze: JavaFX FXMLController
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.
Zobrazeno 4 zpráv z 4.
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.
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
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.
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 )
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();
}
}
Zobrazeno 4 zpráv z 4.