• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Java FXML App oraz model MVC - w jaki sposób to funkcjonuje?

Object Storage Arubacloud
0 głosów
1,571 wizyt
pytanie zadane 2 października 2018 w Java przez allenkun Początkujący (400 p.)

Witam, pytanie moje konkretnie odnosi się do tego jak funkcjonują komponenty (View, Model, Controller) i jak konkretnie działa komunikacja pomiędzy nimi podczas tworzenia aplikacji w Javie? Zacząłem na studiach tworzenie aplikacji i wprowadzenie do modelu MVC, lecz nie dokońca rozumiem zasade jego działania w moim programie. Dodam na starcie, że środowisko jakiego używam to NetBeans i podczas tworzenia aplikacji FXML, środowisko automatycznie tworzy mi 3 pliki:

  • (View) Plik FXML, który mogę obsługiwać za pomocą Scene Buildera i automatycznie generować kod FXML
  • (Controller) Kontroler do mojego pliku FXML
  • Oraz plik główny z metodą main i start

Aby doprecyzować moje pytanie i rozwiać wątpliwości sprecyzuje pewne rzeczy - po wielu próbach analizy kodu jestem mniej więcej w stanie stwierdzić co się dzieje podczas uruchamiania programu i który plik odpowiedzialny jest za co, w skrócie - rozumiem jak koncepcyjnie działa uruchomienie naszego programu i utworzenie naszego głównego okna. Jestem też świadomy tego, że wszystkie metody odpowiedzialne za działanie poszczególnych przycisków czy też innych elementów naszego widoku umieszczamy w kontrolerze. Nie mam jednak pojęcia jak funkcjonuje to w momencie działania aplikacji, a konkretnie - w jaki sposób komponenty porozumiewają się między sobą? Co tak na prawde dzieje sie w momencie "kliknięcia" przycisku? Gdzie notowana jest ta informacja i jak jest przekazywana, aby odnieść rezultat w postaci wywołania metody, a następnie wyświetlenia jej wyniku ponownie na ekranie? Zdaje sobie sprawe ze ma to wiele wspolnego nie tylko z implementacja tego w srodowisku, ile z samym modelem MVC, jednak probowalem czytac wiele artykulow na ten temat i sposob jego dzialania (m.in. Martina Fowlera) i niestety lektury te okazaly sie dla mnie zbyt ciezkie, bylbym wiec wdzieczny gdyby ktos w prosty sposob bylby w stanie wyjasnic mi jak nasz model MVC i komunikacja uzytkownik-komputer funkcjonuje w powyzszym modelu.

komentarz 2 października 2018 przez mbabane Szeryf (79,280 p.)
Napisz jeszcze krotko bo chyba nie zrozumiałem.

Czy chodzi Ci o to jak ogólnie działa MVC tylko chcesz aby wyjaśnić Ci to na przykładzie JavyFx (bez wchodzenia w szczegóły wewnętrznej implementacji samej JavyFx)?

Czy może rozumiesz o co chodzi w MVC i chcesz aby wyjaśnić Ci jak jest MVC zrealizowane (zaimplementowane) w JavieFx?

Jeśli to drugie to nie jestem w stanie raczej pomóc, musisz ustawić chyba debugger w kodzie jakiegoś komponentu JavyFx (do kodu JavyFx zdaje się jest dostęp, także chyba da się to wykonać). i czytać dokumentację JavaFx:

https://docs.oracle.com/javase/8/javafx/api/toc.htm

https://docs.oracle.com/javase/8/javase-books.htm
komentarz 3 października 2018 przez allenkun Początkujący (400 p.)
Chodzi dokladnie o pierwsze pytanie - nie zalezy mi na dokladnej implementacji :) Szukałem materiałów na ten temat, ale większość tak jak wspomniałem jest na tyle skomplikowana, że ciężko jest mi przyswoić tą wiedze.

1 odpowiedź

+2 głosów
odpowiedź 3 października 2018 przez mbabane Szeryf (79,280 p.)
edycja 3 października 2018 przez mbabane
 
Najlepsza

W samym MVC (czyli Model-View-Controller) chodzi o to, że kontroler zarządza modelem i widokiem. 

Model to jest jakaś funkcjonalność, którą ma spełniać aplikacja np. dodawanie dwóch liczb. Operacja ta jest niezależna od widoku. Widok ma dostarczać elementy, które mają pojawić się na ekranie. W przykładzie dodawania będą to dwa pola tekstowe na wprowadzenie wartości oraz jakaś etykieta na wynik. Zadaniem kontrolera jest pośrednictwo między użytkownikiem, funkcjami aplikacji (czyli modelem) oraz tym co ma być wyświetlane (czyli widokiem).

MVC

Zrobiłem kiedyś przykład MVC w konsoli, może też Ci to coś wyjaśni:
https://github.com/mbabanes/java-examples/tree/master/src/main/java/console

W przypadku JavyFx widoki mają postać plików FXML (mogą być też zapisane w Javie). Kontroler, który ma przypisany jakiś FXML (właściwie w JavieFX jest troszkę na odwrót bo to w FXML'u przypisujemy kontroler do widoku, ale z logicznego punktu widzenia to widok przypisywany jest do kontrolera nie odwrotnie - to kontroler ma zarządzać widokiem, nie widok kontrolerem). Przykładowy FXML aplikacji do dodawania dwóch liczb:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.Pane?>
<?import javafx.scene.text.Font?>
<Pane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0"
      prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1"
      fx:controller="mvc.controller.Controller">
    <children>
        <TextField fx:id="number1" layoutX="147.0" layoutY="53.0" promptText="Liczba 1"/>
        <TextField fx:id="number2" layoutX="147.0" layoutY="105.0" promptText="Liczba 2"/>
        <Label fx:id="resultLabel" layoutX="223.0" layoutY="250.0">
            <font>
                <Font size="24.0"/>
            </font>
        </Label>
        <Button layoutX="208.0" layoutY="169.0" mnemonicParsing="false" onAction="#buttonOnAction" text="Dodaj"/>
    </children>
</Pane>

W kontrolerze można przypisać jakieś konkretne kontrolki do zmiennych Javowych. Tutaj będzie potrzebny dostęp do pól tekstowych aby pobrać z nich wprowadzone przez użytkownika dane oraz do etykiety (Label) aby wyświetlić wynik. Dodatkowo w fxmlu można przypisać od razu metody akcji. W tym przypadku taka metoda została przypisana do kliknięcia przycisku. W kontrolerze musi znaleźć się jej sygnatura bo inaczej JavaFx nie zadziała.

Kwestia modelu w tym przypadku jest bardzo prosta. Model czyli logika aplikacji. Logiką jest tutaj dodanie dwóch liczb. Przykładowy model:

public class Model
{
    public int add(int a, int b)
    {
        return a+b;
    }
}

Kod kontrolera:

public class Controller
{
    @FXML
    private TextField number1;

    @FXML
    private TextField number2;

    @FXML
    private Label resultLabel;

    private Model model = new Model();

    @FXML
    void buttonOnAction(ActionEvent event)
    {
        int a = Integer.valueOf( number1.getText() ); //pobiranie wartości pierwszej
        int b = Integer.valueOf( number2.getText() ); //pobieranie wartości drugiej

        int result = model.add(a, b); //dodanie wartośći, za co odpowiada model

        resultLabel.setText(String.valueOf(result)); //przeslanie wyniku do widoku.
    }
}

Kontroler nic nie rysuje, ani nie oblicza on tylko pobiera dane wprowadzone przez uzytkownika i przekazuje je do modelu, po czym przesyła wynik do widoku.

Zauważ teraz jedną rzecz. Sam widok jak i logika aplikacji to całkowicie niezależne byty. Można wziąć klasę modelu i bez żadnych przeszkód użyć jej np. w innym projekcie, czy przetestować jednostkowo:

Model model = new Model();

int a = 15;
int b = 12;

int result = model.add(a, b);

System.out.println( result );

A jeśli chcesz np. zmienić coś w widoku np. układ kontrolek czy kolorki czy coś, to robisz to tylko w FXML bez wchodzenia do klasy kontrolera i dokonywaniu modyfikacji (no chyba, że dokładasz jakąś kontrolkę z akcją - kolejny przycisk czy coś, wtedy trzeba dodać jakąś obsługę w kontrolerze). 

W MVC chodzi o to, że oddzielasz to co ma zrobić aplikacja od tego co i jak ma wyświetlić - nie mieszane są te dwa elementy bo można przecież by było napisać to np. tak:

public class Controller
{
    @FXML
    private TextField number1;

    @FXML
    private TextField number2;

    @FXML
    private Label resultLabel;

    @FXML
    void buttonOnAction(ActionEvent event)
    {
        int a = Integer.valueOf(number1.getText());
        int b = Integer.valueOf(number2.getText());

        int result = a + b;

        resultLabel.setText(String.valueOf(result));
    }
}

Tzn bez modelu, ale brudzisz wtedy sobie klasę kontrolera bo zaczyna ona nie tylko obsługiwać zachowanie użytkownika ale także skupia w sobie to co aplikacja ma robić.

Do JavaFx według mnie całkiem niezły jest ten wideo tutorial:

https://www.youtube.com/playlist?list=PLpzwMkmxJDUwQuQR7Rezut5UE_8UGDxkU

 

komentarz 3 października 2018 przez mbabane Szeryf (79,280 p.)

Dodam jeszcze, że w JavaFX da się zrobić tak aby metoda kliknięcia wyglądała tak:

    @FXML
    void buttonOnAction(ActionEvent event)
    {    
        int result = model.add(); //dodanie wartośći, za co odpowiada model
        resultLabel.setText(String.valueOf(result));
    }

Czyli unika się jawnego pobierania danych z pól tekstowych, są one jakby przesyłane do modelu automatycznie dzięki klasą [X]Property, gdzie X to np. Integer, String itp.

Podobne pytania

0 głosów
1 odpowiedź 1,242 wizyt
pytanie zadane 19 października 2016 w Java przez K0XM4N Gaduła (3,640 p.)
0 głosów
1 odpowiedź 453 wizyt
pytanie zadane 18 czerwca 2020 w Java przez Akiro Bywalec (2,910 p.)
0 głosów
1 odpowiedź 348 wizyt
pytanie zadane 16 września 2018 w Java przez ILikeJava Obywatel (1,230 p.)

92,539 zapytań

141,382 odpowiedzi

319,479 komentarzy

61,928 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...