NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

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

V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Josef Kuchař - Pepa489:14.3.2016 18:27

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.3.2016 18:27
2x piš, jednou debuguj
Avatar
Odpovídá na Josef Kuchař - Pepa489
Petr Štechmüller:14.3.2016 20:18

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í
+2,50 Kč
Řešení problému
Nahoru Odpovědět
14.3.2016 20:18
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Odpovídá na Petr Štechmüller
Josef Kuchař - Pepa489:14.3.2016 21:47

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.3.2016 21:47
2x piš, jednou debuguj
Avatar
Odpovídá na Petr Štechmüller
Josef Kuchař - Pepa489:14.3.2016 22:30

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.3.2016 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.