javafx - poincare.matf.bg.ac.rspoincare.matf.bg.ac.rs/~kartelj/nastava/dpj2015/02/... · zadatak 1...

18
JavaFX Modeli podataka, Observer obrazac

Upload: others

Post on 15-Jul-2020

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: JavaFX - poincare.matf.bg.ac.rspoincare.matf.bg.ac.rs/~kartelj/nastava/DPJ2015/02/... · Zadatak 1 •Ekran treba da sadrži dve liste u kojima su zapisana imena i godišta nekoliko

JavaFX

Modeli podataka, Observer obrazac

Page 2: JavaFX - poincare.matf.bg.ac.rspoincare.matf.bg.ac.rs/~kartelj/nastava/DPJ2015/02/... · Zadatak 1 •Ekran treba da sadrži dve liste u kojima su zapisana imena i godišta nekoliko

ListView komponenta

• Generička komponenta ListView<T>

• Inicijalno prazna

• Postavljanje internog modela podataka korišćenjem metode setItems ili kroz konstruktor

• Mogućnost renderovanja svake ćelije na specifičan način metodom setCellFactory

http://docs.oracle.com/javafx/2/ui_controls/list-view.htm

Page 3: JavaFX - poincare.matf.bg.ac.rspoincare.matf.bg.ac.rs/~kartelj/nastava/DPJ2015/02/... · Zadatak 1 •Ekran treba da sadrži dve liste u kojima su zapisana imena i godišta nekoliko

ListView komponenta

ListView<String> list = new ListView<String>();

ObservableList<String> names = FXCollections.observableArrayList();

names.addAll(Arrays.asList("Petar", "Ana", "Mira", "Marko", "Jovana"));

list.setItems(names);

Page 4: JavaFX - poincare.matf.bg.ac.rspoincare.matf.bg.ac.rs/~kartelj/nastava/DPJ2015/02/... · Zadatak 1 •Ekran treba da sadrži dve liste u kojima su zapisana imena i godišta nekoliko

Pretplaćivanje na događaje Observer(s) - Observable

• Newsletter, grupe

• Pretplata na časopis

• Obaveštenja javnih službi

• Sudski pozivi itd...

Page 5: JavaFX - poincare.matf.bg.ac.rspoincare.matf.bg.ac.rs/~kartelj/nastava/DPJ2015/02/... · Zadatak 1 •Ekran treba da sadrži dve liste u kojima su zapisana imena i godišta nekoliko

UML model Observera

Page 6: JavaFX - poincare.matf.bg.ac.rspoincare.matf.bg.ac.rs/~kartelj/nastava/DPJ2015/02/... · Zadatak 1 •Ekran treba da sadrži dve liste u kojima su zapisana imena i godišta nekoliko

Primene u programiranju

1. MVC je baziran na Observeru – Smalltalk

2. Document View Architecture – skoro ekvivalentno MVC-u (Ažuriranje promena u različitim pogledima istog dokumenta)

Page 7: JavaFX - poincare.matf.bg.ac.rspoincare.matf.bg.ac.rs/~kartelj/nastava/DPJ2015/02/... · Zadatak 1 •Ekran treba da sadrži dve liste u kojima su zapisana imena i godišta nekoliko

Observer u javi

• Observer interfejs

– update

• Observable klasa

– addObserver

– notifyObservers

Page 8: JavaFX - poincare.matf.bg.ac.rspoincare.matf.bg.ac.rs/~kartelj/nastava/DPJ2015/02/... · Zadatak 1 •Ekran treba da sadrži dve liste u kojima su zapisana imena i godišta nekoliko

Zadatak 1

• Ekran treba da sadrži dve liste u kojima su zapisana imena i godišta nekoliko osoba

• Između listi treba da stoje dva dugmeta označena sa “>>” i “<<”

• Svaki pojedinačni unos u listi je objekat klase Person koja je opisana imenom i godinom rođenja

• Inicijalno kreirati po tri elementa u levoj i desnoj listi

• Odabirom elementa iz leve liste i klikom na “>>”, taj element je potrebno prebaciti na kraj desne liste (analogno i za dugme “<<”)

Page 9: JavaFX - poincare.matf.bg.ac.rspoincare.matf.bg.ac.rs/~kartelj/nastava/DPJ2015/02/... · Zadatak 1 •Ekran treba da sadrži dve liste u kojima su zapisana imena i godišta nekoliko

Dodatno (za domaći)

• Omogućiti da svaka ćelija bude obojena nekom slučajno odabranom bojom

• Za ovo koristiti metodu setCellFactory

Page 10: JavaFX - poincare.matf.bg.ac.rspoincare.matf.bg.ac.rs/~kartelj/nastava/DPJ2015/02/... · Zadatak 1 •Ekran treba da sadrži dve liste u kojima su zapisana imena i godišta nekoliko

TableView komponenta

• Ideja je da napravimo nešto ovakvo, samo bez editovanja ćelija.

http://docs.oracle.com/javafx/2/ui_controls/table-view.htm

Page 11: JavaFX - poincare.matf.bg.ac.rspoincare.matf.bg.ac.rs/~kartelj/nastava/DPJ2015/02/... · Zadatak 1 •Ekran treba da sadrži dve liste u kojima su zapisana imena i godišta nekoliko

Pristup 1 – negenerička tabela

/* Ne bas najbolji pristup jer ne koristi genericka svojstva tabele */

TableView table = new TableView();

TableColumn firstNameCol = new TableColumn("First Name");

TableColumn lastNameCol = new TableColumn("Last Name");

TableColumn emailCol = new TableColumn("Email");

table.getColumns().addAll(firstNameCol, lastNameCol, emailCol);

Page 12: JavaFX - poincare.matf.bg.ac.rspoincare.matf.bg.ac.rs/~kartelj/nastava/DPJ2015/02/... · Zadatak 1 •Ekran treba da sadrži dve liste u kojima su zapisana imena i godišta nekoliko

Pristup 1 - prikaz

Page 13: JavaFX - poincare.matf.bg.ac.rspoincare.matf.bg.ac.rs/~kartelj/nastava/DPJ2015/02/... · Zadatak 1 •Ekran treba da sadrži dve liste u kojima su zapisana imena i godišta nekoliko

Pristup 2 – generička TableView<T>

• Pravimo najpre klasu koju hoćemo da predstavimo tabelom:

public class Person { private final SimpleStringProperty firstName; private final SimpleStringProperty lastName; private final SimpleStringProperty email; private Person(String fName, String lName, String email) { this.firstName = new SimpleStringProperty(fName); this.lastName = new SimpleStringProperty(lName); this.email = new SimpleStringProperty(email); } ... }

Page 14: JavaFX - poincare.matf.bg.ac.rspoincare.matf.bg.ac.rs/~kartelj/nastava/DPJ2015/02/... · Zadatak 1 •Ekran treba da sadrži dve liste u kojima su zapisana imena i godišta nekoliko

Povezivanje kolona tabele sa klasom

//pravimo kolone i asociramo ih sa poljima u klasi Person TableColumn<Person, String> firstNameCol = new TableColumn<Person, String>("First Name"); firstNameCol.setCellValueFactory(new PropertyValueFactory<Person,String>("firstName"); ... table.getColumns().add(firstNameCol); table.getColumns().add(lastNameCol); ...

Page 15: JavaFX - poincare.matf.bg.ac.rspoincare.matf.bg.ac.rs/~kartelj/nastava/DPJ2015/02/... · Zadatak 1 •Ekran treba da sadrži dve liste u kojima su zapisana imena i godišta nekoliko

Dodavanje podataka kao i kod liste

ObservableList<Person> data = FXCollections.observableArrayList(

new Person("Petar", "Petrovic", "[email protected]"),

new Person("Ana", "Joksic", "[email protected]"),

new Person("Aleksandar", "Kartelj",

"[email protected]"));

table.setItems(data);

Page 16: JavaFX - poincare.matf.bg.ac.rspoincare.matf.bg.ac.rs/~kartelj/nastava/DPJ2015/02/... · Zadatak 1 •Ekran treba da sadrži dve liste u kojima su zapisana imena i godišta nekoliko

Krajnji izgled

• Ostaje još dodavanje novih redova, ali to je lako.

• Probajte sami...

Page 17: JavaFX - poincare.matf.bg.ac.rspoincare.matf.bg.ac.rs/~kartelj/nastava/DPJ2015/02/... · Zadatak 1 •Ekran treba da sadrži dve liste u kojima su zapisana imena i godišta nekoliko

Zadatak 2

• Napraviti program koji učitava .csv datoteku i prikazuje je u tabeli

• .csv je tabelarni format u kojem je između svaka dva podatka „;“ ili „,“

• Datoteka sadrži spisak studenata u sledećem formatu:

Ime; Prezime; Indeks; Prosecna ocena; Omiljena boja;

Petar; Petrovic; 10/2005; 9.5; #ffcc88;

Ana; Popovic; 67/2009; 9.1; #f763345;

Page 18: JavaFX - poincare.matf.bg.ac.rspoincare.matf.bg.ac.rs/~kartelj/nastava/DPJ2015/02/... · Zadatak 1 •Ekran treba da sadrži dve liste u kojima su zapisana imena i godišta nekoliko

Zadatak 2

• Potrebno je napraviti aplikaciju koja omogućava: – učitavanje datoteke (file open dialog),

– čuvanje tabele u datoteku (file save dialog)

– izmenu učitane tabele (editable mode)

• Dodatno: poslednja kolona sa omiljenom bojom treba da se oboji u skladu sa rgb kodom iz csv datoteke.

• Kada se vrši postavljanje druge boje potrebno je izvršiti proveru da li je uneti format naziva boje korektan.