🏗️ Implement VM and make Stub

main
Alexis Drai 3 years ago
parent 3505f380ec
commit ba93364bed

@ -2,14 +2,19 @@
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import java.lang.Integer?>
<BorderPane xmlns="http://javafx.com/javafx" xmlns:fx="http://javafx.com/fxml">
<fx:define>
<Integer fx:id="minus1" fx:value="-1"/>
</fx:define>
<center>
<ListView fx:id="promLV"/>
</center>
<bottom>
<HBox>
<Button text="add student" onAction="#clickAddStudent"/>
<Button text="remove student" onAction="#clickRemoveStudent"/>
<Button text="remove student" onAction="#clickRemoveStudent"
disable="${promLV.selectionModel.selectedIndex == minus1}"/>
<Button text="QUIT" onAction="#clickQuit"/>
</HBox>
</bottom>

@ -1,6 +1,7 @@
package data;
import viewmodel.PromotionVM;
import viewmodel.StudentVM;
public class Stub implements Loadable {
@ -8,7 +9,10 @@ public class Stub implements Loadable {
public PromotionVM load(){
PromotionVM VM = new PromotionVM();
//... add studentVMs
VM.addStudentVM(new StudentVM("ONE", "Alan"));
VM.addStudentVM(new StudentVM("TWO", "Allan"));
VM.addStudentVM(new StudentVM("THREE", "Alllan"));
VM.addStudentVM(new StudentVM("FOUR", "Allllan"));
return VM;
}

@ -1,14 +1,62 @@
package model;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Promotion implements Serializable {
public static final String PROP_PROMOTION_ADD_STUDENT = "model.Promotion.addStudent";
public static final String PROP_PROMOTION_RMV_STUDENT = "model.Promotion.removeStudent";
private final List<Student> students = new ArrayList<>();
public List<Student> getStudents() {
return Collections.unmodifiableList(students);
}
public void addStudent(Student toAdd) {
if (toAdd != null) {
int i = 0;
students.add(i, toAdd);
// fire
getSupport().fireIndexedPropertyChange(
PROP_PROMOTION_ADD_STUDENT,
i,
students.size() > i + 1 ? students.get(i + 1) : null,
toAdd
);
}
}
public void removeStudent(Student toRemove) {
if (toRemove != null) {
int i = students.indexOf(toRemove);
students.remove(i);
// fire
getSupport().fireIndexedPropertyChange(
PROP_PROMOTION_RMV_STUDENT,
i,
toRemove,
students.size() > i ? students.get(i) : null
);
}
}
PropertyChangeSupport support = null;
public PropertyChangeSupport getSupport() {
if (support == null) {
support = new PropertyChangeSupport(this);
}
return support;
}
public void addListener(PropertyChangeListener listener) {
getSupport().addPropertyChangeListener(listener);
}
}

@ -1,31 +1,59 @@
package model;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.io.Serializable;
public class Student implements Serializable {
public static final String PROP_STUDENT_LASTNAME = "model.Student.lastname";
public static final String PROP_STUDENT_FIRSTNAME = "model.Student.firstname";
private String lastname;
private String firstName;
private String firstname;
public Student(String lastname, String firstName) {
this.lastname = !lastname.isEmpty() ? lastname : "DOE";
this.firstName = !firstName.isEmpty() ? firstName : "John";
this.firstname = !firstName.isEmpty() ? firstName : "John";
}
public String getLastname() {
return lastname;
}
public String getFirstName() {
return firstName;
public String getFirstname() {
return firstname;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
public void setLastname(String lastname) {
if(lastname != null) {
String oldV = getLastname();
this.lastname = lastname;
// fire
getSupport().firePropertyChange(PROP_STUDENT_LASTNAME, oldV, getLastname());
}
}
public void setLastname(String lastname) {
this.lastname = lastname;
public void setFirstname(String firstname) {
if(firstname != null) {
String oldV = getFirstname();
this.firstname = firstname;
// fire
getSupport().firePropertyChange(PROP_STUDENT_FIRSTNAME, oldV, getFirstname());
}
}
private PropertyChangeSupport support = null;
public PropertyChangeSupport getSupport() {
if (support == null) {
support = new PropertyChangeSupport(this);
}
return support;
}
public void addListener(PropertyChangeListener listener) {
getSupport().addPropertyChangeListener(listener);
}
}

@ -16,12 +16,12 @@ public class MainWindow {
@FXML
private void clickAddStudent() {
VM.addStudent();
VM.addStudentVM();
}
@FXML
private void clickRemoveStudent() {
VM.removeStudent(promLV.getSelectionModel().getSelectedItem());
VM.removeStudentVM(promLV.getSelectionModel().getSelectedItem());
}
@FXML
@ -37,6 +37,21 @@ public class MainWindow {
@FXML
private void initialize() {
promLV.itemsProperty().bind(VM.studentsVMProperty());
initPromLV();
promLV.setCellFactory(__ -> new StudentVMCell());
}
private void initPromLV() {
promLV.getSelectionModel().selectedItemProperty().addListener((__, oldV, newV) -> {
if (oldV != null) {
lastnameTF.textProperty().unbindBidirectional(oldV.lastnameProperty());
firstnameTF.textProperty().unbindBidirectional(oldV.firstnameProperty());
}
if (newV != null) {
lastnameTF.textProperty().bindBidirectional(newV.lastnameProperty());
firstnameTF.textProperty().bindBidirectional(newV.firstnameProperty());
}
});
}
}

@ -0,0 +1,29 @@
package view;
import javafx.scene.control.Label;
import javafx.scene.control.ListCell;
import javafx.scene.layout.BorderPane;
import viewmodel.StudentVM;
public class StudentVMCell extends ListCell<StudentVM> {
@Override
protected void updateItem(StudentVM item, boolean empty) {
super.updateItem(item, empty);
if (!empty) {
Label lastnameLbl = new Label();
Label firstnameLbl = new Label();
lastnameLbl.textProperty().bind(item.lastnameProperty());
firstnameLbl.textProperty().bind(item.firstnameProperty());
BorderPane pane = new BorderPane();
pane.setLeft(lastnameLbl);
pane.setCenter(firstnameLbl);
setGraphic(pane);
}
else {
setGraphic(null);
}
}
}

@ -1,28 +1,70 @@
package viewmodel;
import javafx.beans.property.ListProperty;
import javafx.beans.property.ReadOnlyListProperty;
import javafx.beans.property.SimpleListProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import model.Promotion;
public class PromotionVM {
import java.beans.IndexedPropertyChangeEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
private Promotion model;
public class PromotionVM implements PropertyChangeListener {
private final Promotion model;
public Promotion getModel() {
return model;
}
public PromotionVM(Object o) {
Promotion model;
if (o instanceof Promotion) {
model = (Promotion) o;
}
else {
model = new Promotion();
}
this.model = model;
// load
model.getStudents().forEach(s -> studentsVMObs.add(new StudentVM(s)));
// subscribe
model.addListener(this);
// promise to update
// ... in methods
}
public PromotionVM() {
this(null);
}
public Promotion getModel() {
return model;
public void addStudentVM(StudentVM toAdd) {
model.addStudent(toAdd.getModel());
}
public void addStudent(StudentVM toAdd) {
public void addStudentVM() {addStudentVM(new StudentVM());}
public void removeStudentVM(StudentVM toRemove) {
model.removeStudent(toRemove.getModel());
}
public void addStudent() { addStudent(new StudentVM()); }
private final ObservableList<StudentVM> studentsVMObs = FXCollections.observableArrayList();
private final ListProperty<StudentVM> studentsVM = new SimpleListProperty<>(studentsVMObs);
public ObservableList<StudentVM> getStudentsVM() {return FXCollections.unmodifiableObservableList(studentsVM.get());}
public ReadOnlyListProperty<StudentVM> studentsVMProperty() {return studentsVM;}
public void removeStudent(StudentVM toRemove) {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if (evt.getPropertyName().equals(Promotion.PROP_PROMOTION_ADD_STUDENT)) {
studentsVMObs.add(((IndexedPropertyChangeEvent) evt).getIndex(), new StudentVM(evt.getNewValue()));
}
if (evt.getPropertyName().equals(Promotion.PROP_PROMOTION_RMV_STUDENT)) {
studentsVMObs.remove(((IndexedPropertyChangeEvent) evt).getIndex());
}
}
}

@ -1,4 +1,76 @@
package viewmodel;
public class StudentVM {
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import model.Student;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
public class StudentVM implements PropertyChangeListener {
private final Student model;
public Student getModel() {
return model;
}
private final StringProperty lastname = new SimpleStringProperty();
public String getLastname() {return lastname.get();}
public StringProperty lastnameProperty() {return lastname;}
public void setLastname(String lastname) {this.lastname.set(lastname);}
private final StringProperty firstname = new SimpleStringProperty();
public String getFirstname() {return firstname.get();}
public StringProperty firstnameProperty() {return firstname;}
public void setFirstname(String firstname) {this.firstname.set(firstname);}
public StudentVM(Object o) {
Student model;
if (o instanceof Student) {
model = (Student) o;
}
else {
model = new Student("", "");
}
this.model = model;
// load into self
setFirstname(model.getFirstname());
setLastname(model.getLastname());
// subscribe
model.addListener(this);
// promise to update
firstnameProperty().addListener((__, ___, newV) -> model.setFirstname(newV));
lastnameProperty().addListener((__, ___, newV) -> model.setLastname(newV));
}
public StudentVM(String lastname, String firstname) {
this(new Student(lastname, firstname));
}
public StudentVM(Student model) {
this((Object) model);
}
public StudentVM() {
this(null);
}
@Override
public void propertyChange(PropertyChangeEvent evt) {
if (evt.getPropertyName().equals(Student.PROP_STUDENT_LASTNAME)) {
setLastname(isNotEmptyOrToDashes((String) evt.getNewValue()));
}
if (evt.getPropertyName().equals(Student.PROP_STUDENT_FIRSTNAME)) {
setFirstname(isNotEmptyOrToDashes((String) evt.getNewValue()));
}
}
private String isNotEmptyOrToDashes(String stringEvt) {
return stringEvt.isEmpty() ? "---" : stringEvt;
}
}

Loading…
Cancel
Save