Diskuze: JavaFX - Předávání referencí mezi controllery

Java Java JavaFX - Předávání referencí mezi controllery

Avatar
Josef Kuchař (Pepa489):

Ahoj,
Potřebuji předávat reference mezi controllery, například mám login controller a předat session hlavní aplikaci. Již jsem googlil, asi špatně hledám, ale vidím tam samé věci se statikou nebo jiné podobně šílené věci. Co jsem zjistil je to, že je to jako MVC bez modelu a ten je potřeba dodělat. Jak mám tedy efektivně předávat reference? Díky předem za odpovědi

Odpovědět 14. března 18:27
2x piš, jednou debuguj
Avatar
Odpovídá na Josef Kuchař (Pepa489)
Petr Štechmüller:

Ahoj, nejjednodušší je předávat reference přes konstruktor. Můžeš sem hodit nějaký kód, a popsat, s čím máš problém?

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět 14. března 20:18
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Odpovídá na Petr Štechmüller
Josef Kuchař (Pepa489):

LoginController

package cz.josefkuchar.stravaplus;

import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.*;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.CheckBox;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TextField;
import javafx.stage.Stage;


public class LoginController {
    WebClient webClient;

    @FXML
    private TextField organisationIdTextField;
    @FXML
    private TextField idTextField;
    @FXML
    private PasswordField passwordPasswordField;
    @FXML
    private CheckBox rememberPasswordCheckBox;
    @FXML
    private CheckBox automaticLoginCheckBox;
    @FXML
    private Button sendButton;

    @FXML
    private void handleSend(ActionEvent actionEvent)
    {
        String organisationId = organisationIdTextField.getText();
        String id = idTextField.getText();
        String password = passwordPasswordField.getText();
        login(organisationId, id, password);
        Stage stage = new Stage();
        FXMLLoader loader = new FXMLLoader(getClass().getResource("MainView.fxml"));
        try {
            Parent root = loader.load();
            Scene scene = new Scene(root);
            stage.setScene(scene);
        } catch (Exception e) {}
        MainViewController mainViewController = loader.<MainViewController>getController();
        mainViewController.setWebClient(webClient);
        stage.show();
    }

    private void login(String organisationId, String id, String password)
    {
        System.out.println("Jo");
        HtmlPage page = null;
        webClient = new WebClient(BrowserVersion.BEST_SUPPORTED);
        try{
            page = webClient.getPage("http://www.strava.cz/Strava/Stravnik/prihlaseni?zobrazeni=mobilni");
        } catch (Exception e)
        {
            System.out.println("Chyba při stahování přihlašovací stránky: " + e);
        }
        HtmlForm form =  (HtmlForm) page.getElementById("ctl12");
        HtmlNumberInput organisationIdHtml = form.getInputByName("zarizeni");
        organisationIdHtml.setValueAttribute(organisationId);
        HtmlTextInput idHtml = form.getInputByName("uzivatel");
        idHtml.setValueAttribute(id);
        HtmlPasswordInput passwordHtml = form.getInputByName("heslo");
        passwordHtml.setValueAttribute(password);
        HtmlImageInput submit = (HtmlImageInput) form.getByXPath("//*[contains(@class, 'prihlaseni-prihlasit')]").get(0);
        try{
            submit.click();
        } catch (Exception e)
        {
            System.out.print("Chyba při přihlašování: " + e);
        }
    }
}

MainViewController

package cz.josefkuchar.stravaplus;

import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlPage;

/**
 * StravaPlus vytvořil Josef
 */
public class MainViewController {
    private static WebClient webClient;
    MainViewController()
    {
        HtmlPage page = null;
        try{
            page = webClient.getPage("https://www.strava.cz/Strava/Stravnik/Objednavky");
        } catch (Exception e) {}
        System.out.print(page.asXml());


    }
    public void setWebClient(WebClient webClient)
    {
        this.webClient = webClient;
    }
}

Tohle samozřejmě nefunguje, nevím jak tam při vytváření zavolat konstruktor, takhle to hází null pointer exception

Nahoru Odpovědět 14. března 21:47
2x piš, jednou debuguj
Avatar
Odpovídá na Petr Štechmüller
Josef Kuchař (Pepa489):

Asi jsem to vyřešil:

Stage stage = new Stage();
        MainViewController mainViewController = new MainViewController(webClient);
        FXMLLoader loader = new FXMLLoader(getClass().getResource("MainView.fxml"));
        loader.setController(mainViewController);
        try {
            Parent root = loader.load();
            Scene scene = new Scene(root);
            stage.setScene(scene);
        } catch (Exception e) {}
        stage.show();
Nahoru Odpovědět 14. března 22:30
2x piš, jednou debuguj
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.