Další komponenty Gui Návrhový vzor Observer
Projekt PrepinaniBarevFX_List
Diskuse k řešení
Návrhový vzor Observer
Návrhový vzor Observer
Projekt PrepinaniBarevFX_Observer /1
Projekt PrepinaniBarevFX_Observer /2 Výsledek programu s použitým observerem
Projekt PrepinaniBarevFX_Observer /3
Projekt PrepinaniBarevFX_Observer /4 třída SeznamBarev – je observerem
Projekt PrepinaniBarevFX_Observer /6 třída PrepinaniBarevFX – je subjektem
Projekt PrepinaniBarevFX_Observer /7 třída PrepinaniBarevFX
219.48K
Category: informaticsinformatics

Další komponenty Gui Návrhový vzor Observer

1. Další komponenty Gui Návrhový vzor Observer

Kurz 4IT115
od ZS 2015
3. cvičení
Další komponenty Gui
Návrhový vzor Observer
Alena Buchalcevová
katedra informačních technologií
Vysoká škola ekonomická v Praze
[email protected]

2. Projekt PrepinaniBarevFX_List

2
Kurz 4IT115 cvičení
©Alena Buchalcevová

3. Diskuse k řešení

Na volbě RadioButtonu závisí
změna barvy pozadí v panelu dolu
změna seznamu barev
Mohli bychom chtít přidat ještě další závislé objekty
V tomto řešení jsou objekty přímo uvedeny v ovladači – těsná vazba
Musíme také přesně vědět, co dělat – jednou voláme setStyle, podruhé metodu add
cervenaRadioB.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
dolniFlowPane.setStyle("-fx-background-color: red;");
barvyData.add("červená");
}
});
3
modraRadioB.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
dolniFlowPane.setStyle("-fx-background-color: blue;");
barvyData.add("modrá");
}
});
Kurz 4IT115 cvičení
©Alena Buchalcevová

4. Návrhový vzor Observer

Problém:
Na stavu jednoho objektu závisí jiné objekty. Jakmile se změní
stav tohoto objektu, všechny na něm závislé je třeba informovat
Objekty by měly být volně vázané – to znamená, že objekt,
který změní svůj stav a bude o tom informovat ostatní, by
neměl být závislý na jejich vnitřním uspořádání.
Objekty, které budou přijímat informace o změně stavu,
nemusí být předem známy.
Řešení:
Objekt, který mění svůj stav, subjekt posílá informaci těm, kteří
se u něj zaregistrovali jako pozorovatelé – observer.
Každý pozorovatel musí mít definovánu speciální metodu update,
kterou subjekt volá.
4
Kurz 4IT115 cvičení
©Alena Buchalcevová

5. Návrhový vzor Observer

5
Kurz 4IT115 cvičení
©Alena Buchalcevová

6. Projekt PrepinaniBarevFX_Observer /1

6
Kurz 4IT115 cvičení
©Alena Buchalcevová

7. Projekt PrepinaniBarevFX_Observer /2 Výsledek programu s použitým observerem

7
Kurz 4IT115 cvičení
©Alena Buchalcevová

8. Projekt PrepinaniBarevFX_Observer /3

v balíčku util jsou deklarována dvě rozhraní
public interface SubjektZmenyBarvy {
public void registerObserver(ObserverProBarvy kdoSeRegistruje);
public void removeObserver(ObserverProBarvy kdoRusiRegistraci);
public void notifyObservers();
public String getAktualniBarva();
public String getAktualniStyle();
}
public interface ObserverProBarvy {
public void update();
}
8
Kurz 4IT115 cvičení
©Alena Buchalcevová

9. Projekt PrepinaniBarevFX_Observer /4 třída SeznamBarev – je observerem

public class SeznamBarev implements ObserverProBarvy{
private ListView<String> barvyList;
private ObservableList<String> barvyData;
private SubjektZmenyBarvy subjekt ;
9
public SeznamBarev (SubjektZmenyBarvy subjekt) {
this.subjekt = subjekt;
subjekt.registerObserver(this);
init();
}
private void init() {
barvyList = new ListView<>();
barvyData = FXCollections.observableArrayList();
barvyList.setItems(barvyData);
barvyList.setPrefWidth(100);
update();
}
public ListView getList() {
return barvyList;
}
@Override
public void update() {
barvyData.add(subjekt.getAktualniBarva());
}
}
Musí se zaregistrovat k
subjektu
Přidá barvu do seznamu
Kurz 4IT115 cvičení
©Alena Buchalcevová

10.

Projekt PrepinaniBarevFX_Observer /5
třída DolniPanel – je observerem
public class DolniPanel implements ObserverProBarvy{
private FlowPane dolniFlowPane;
private SubjektZmenyBarvy subjekt;
public DolniPanel(SubjektZmenyBarvy subjekt) {
this.subjekt = subjekt;
subjekt.registerObserver(this);
init();
}
private void init() {
dolniFlowPane = new FlowPane();
dolniFlowPane.setPrefHeight(100);
update();
}
public FlowPane getDolniPanel() {
return dolniFlowPane;
}
@Override
public void update() {
dolniFlowPane.setStyle(subjekt.getAktualniStyle());
}
10
Musí se zaregistrovat k
subjektu
Nastaví barvu pozadí
}
Kurz 4IT115 cvičení
©Alena Buchalcevová

11. Projekt PrepinaniBarevFX_Observer /6 třída PrepinaniBarevFX – je subjektem

public class PrepinaniBarevFX extends Application implements SubjektZmenyBarvy {
private List <ObserverProBarvy> seznamObserveru;
seznamObserveru = new ArrayList<ObserverProBarvy>();
.
.
cervenaRadioB.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
aktualniStyle = "-fx-background-color: red;";
aktualniBarva = "červená";
notifyObservers();
}
});
upozorní pozorovatele
dolniPanel = new DolniPanel(this);
border.setBottom(dolniPanel.getDolniPanel());
seznamBarev = new SeznamBarev(this);
border.setRight(seznamBarev.getList());
11
Kurz 4IT115 cvičení
©Alena Buchalcevová

12. Projekt PrepinaniBarevFX_Observer /7 třída PrepinaniBarevFX

public void registerObserver(ObserverProBarvy kdoSeRegistruje) {
seznamObserveru.add(kdoSeRegistruje);
}
public void removeObserver(ObserverProBarvy kdoRusiRegistraci) {
seznamObserveru.remove(kdoRusiRegistraci);
}
public void notifyObservers() {
for(ObserverProBarvy obs: seznamObserveru){
obs.update();
}
}
public String getAktualniBarva() {
return aktualniBarva;
}
public String getAktualniStyle() {
return aktualniStyle;
}
12
Kurz 4IT115 cvičení
©Alena Buchalcevová
English     Русский Rules