Wpis z mikrobloga

Tworze prosta apke w JavaFX.

1. Mam glowna klase Main, ktora uruchamia glowne okno aplikacji (BorderPane). W glownym BorderPane jest za includowany VBox z logowaniem.
- kod java: https://pastebin.com/u1C8pQ4f
- fxml mainBorder: https://pastebin.com/ZJntShnZ
- zaincludowany fxml logowania: https://pastebin.com/pK7ubaeE

2. Ten FXML ma kontroler - 'MainController'.
- kod java: https://pastebin.com/1LdK9pvp

3. No i nie mam pojecia jak przekazac referencje tego MainControllera (jest tam metoda odpowiedzialna za wylaczneie VBox okna logowania) do kontrolera odpowiedzialnego z logike logowania. Gdy w LoginController uzykownik wpisze poprawne haslo wtedy chcialbym po prostu wywolac mainController.disabledLogin() i chcialbym, zeby zniknal VBox logowania. Cudowalem juz na kazdy sposob. Albo mam nulle, albo dostaje kompletnie nowy objekt MainController i wtedy ta metoda nie usuwa VBox logowania.

Ma ktos jakas recepte jak przekazac dokladnie ten obiekt MainController do LoginController i dzieki czemu moglbym normalnie usunac VBox logowania za pomoca metody z MainControllera?

Bardzo prosil o wszelkie rady, bo siedze juz nad tym problemem dlugo i moze w ogole moja archtektura kodu jest do bani.

#java #javafx #naukaprogramowania
  • 12
@Eoghan: @Patres:

w MainController jest:

@FXML
private LoginController loginWindowController;

@FXML
public void initialize() {
System.out.println(this); //printuje, zeby sprawdzic jaki to jest obiekt
loginWindowController.setMainController(this);
}`

Includuje jeden z komponentow (okno logowania) w ten sposob.

w fxml jest:


Wydaje sie, ze wszystko powinno byc ok.

Potem w w LoginController chce wywolac ta referencja, ktora przekazlem i wyskakuje NULL, wiec nie mam dostepu do metody z MainController.

Output:
controllers.MainController@55ef2a78 //ten print z initialize();
@Eoghan: @Patres: Wydaje mi sie, ze przechodzi to normalnie, ale potem jest tworzony kolejny zdublowany obiekt LoginController i on juz jest bez MainControllera i nie mam pojecia jak to wylapac gdzie to sie dzieje.
@Patres: https://github.com/kkpol1/RestaurantSystem

haslo do logowania: 1233

Ogolnie nie patrz na clean code/UI, bo tam sporo do poprawy, ale przez ten problem przerabialem to juz 39473 razy i skupilem sie glownie, zeby znalezc ten problem.

Chodzi o to, zeby w LoginController w metodzie public void correctLogin(ActionEvent actionEvent) po poprawnym zalogowaniu mozna bylo wywlowac za pomoc mainController metode disabledLogin(), zeby to okno zniknelo.
@kkpol: FxmlUtils to twoja klasa? Jakbyś w kontrolerze logowania zrobił publiczną metodę w stylu setMainController(MainController mainController) - wtedy możesz sobie przekazać referencję maincontrollera do logincontrollera przy ładowaniu logincontrollera. FXMLLoaderem możesz odwołać się do kontrolera tego co ładujesz.

FXMLLoader fxmlLoader = new FXMLLoader(...);
Parent root = fxmlLoader.load();
((LoginController)fxmlLoader.getController()).setMainController(this);
@kkpol: No nad czystością kodu na pewno musisz popracować ( ͡° ͜ʖ ͡°) Ale mam rozwiązanie:
1. W MainBorderPane.fxml do Pane dodajesz fx:id="pane"
2. W MainController dodajesz
@FXML
private Pane pane;
3. Oraz zmieniasz
public void disabledLogin(){
borderPane.getChildren().remove(pane);
}
4. W LoginController zmieniasz metodę
public void confrmButton(ActionEvent actionEvent)
...
if(CORRECT_PASSWORD.equals(password)){
mainController.disabledLogin();
} else{
...

W razie pytań pisz śmiało
@Patres: Wow wow wow Haha. Bez jaj ( ͡° ͜ʖ ͡°) To dziala. Dzieki wielkie mistrzu.

Zakrecilem sie przy tym jak nie powiem co. Ciezko bylo mi to wylapac i teraz bede to analizowal dlaczego to dziala tak,a nie inaczej. Troche to dla mnie nielogiczne, ze raz ta referencja jest przekazana, a raz jest nullem. Dlaczego jak wrzuce mainController.disabledLogin() do metody 'public void confrmButton(ActionEvent actionEvent)' to wtedy