====== Correction TP4 ======
===== MVC =====
Seuls UserInterface et Controller ont changé. On a mis en place des getter dans UserInterface et ont les a utilisés dans le contrôleur.
=== UserInterface.java ===
package com.mco;
import javafx.scene.Group;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.layout.HBox;
import javafx.scene.text.Text;
public class UserInterface {
private Group root;
private TextField todoItemInput;
private Button addButton;
public UserInterface() {
root = generateUI();
}
private Group generateUI() {
Group uiRoot = new Group();
HBox hBox = new HBox(10);
uiRoot.getChildren().add(hBox);
Text text = new Text("Input:");
todoItemInput = new TextField();
addButton = new Button("add");
hBox.getChildren().addAll(text, todoItemInput, addButton);
return uiRoot;
}
public Group getRoot() {
return root;
}
public TextField getTodoItemInput() {
return todoItemInput;
}
public Button getAddButton() {
return addButton;
}
}
=== Controller.java ===
package com.mco;
import javafx.event.ActionEvent;
import javafx.scene.control.Button;
import java.util.ArrayList;
public class Controller {
private ArrayList model;
private UserInterface vue;
public Controller(ArrayList model, UserInterface vue) {
this.model = model;
this.vue = vue;
Button button = vue.getAddButton();
button.setOnAction(this::handleButtonAdd);
}
private void handleButtonAdd(ActionEvent actionEvent) {
String todoItemText = vue.getTodoItemInput().getText();
if (!todoItemText.equals("")) {
model.add(todoItemText);
}
System.out.println(model);
}
}
===== Amélioration de UI =====
Javafx 8 permet de faire de nombreux agencements de composants graphique, lisez par exemple ce [[http://docs.oracle.com/javase/8/javafx/layout-tutorial/builtin_layouts.htm|tutorial sur les layouts]].
==== Représentez le modèle ====
On a ajouté un champ contenant notre liste dans la vue et on l'a utilisé dans le contrôleur.
=== UserInterface.java ===
package com.mco;
import javafx.scene.Group;
import javafx.scene.control.Button;
import javafx.scene.control.ScrollPane;
import javafx.scene.control.TextField;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.text.Text;
public class UserInterface {
private Group root;
private TextField todoItemInput;
private Button addButton;
private VBox todoItemList;
public UserInterface() {
root = generateUI();
}
private Group generateUI() {
Group uiRoot = new Group();
HBox hBox = new HBox(10);
Text text = new Text("Input:");
todoItemInput = new TextField();
addButton = new Button("add");
hBox.getChildren().addAll(text, todoItemInput, addButton);
VBox vBox = new VBox(20);
todoItemList = new VBox(5);
ScrollPane scrollPane = new ScrollPane();
scrollPane.setContent(todoItemList);
scrollPane.setPrefSize(200, 200);
vBox.getChildren().add(hBox);
vBox.getChildren().add(scrollPane);
uiRoot.getChildren().add(vBox);
return uiRoot;
}
public Group getRoot() {
return root;
}
public TextField getTodoItemInput() {
return todoItemInput;
}
public Button getAddButton() {
return addButton;
}
public VBox getTodoItemList() {
return todoItemList;
}
}
=== Controller.java ===
package com.mco;
import javafx.event.ActionEvent;
import javafx.scene.control.Button;
import javafx.scene.text.Text;
import java.util.ArrayList;
public class Controller {
private ArrayList model;
private UserInterface vue;
public Controller(ArrayList model, UserInterface vue) {
this.model = model;
this.vue = vue;
Button button = vue.getAddButton();
button.setOnAction(this::handleButtonAdd);
}
private void handleButtonAdd(ActionEvent actionEvent) {
String todoItemText = vue.getTodoItemInput().getText();
if (!todoItemText.equals("")) {
model.add(todoItemText);
vue.getTodoItemList().getChildren().add(new Text(todoItemText));
}
}
}
==== Ajout du résumé ====
=== UserInterface.java ===
package com.mco;
import javafx.scene.Group;
import javafx.scene.control.Button;
import javafx.scene.control.ScrollPane;
import javafx.scene.control.TextField;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.text.Text;
public class UserInterface {
private Group root;
private TextField todoItemInput;
private Button addButton;
private VBox todoItemList;
private Text totalItem;
private int numberTotalItem;
public UserInterface() {
numberTotalItem = 0;
root = generateUI();
}
private Group generateUI() {
Group uiRoot = new Group();
HBox hBox = new HBox(10);
Text text = new Text("Input:");
todoItemInput = new TextField();
addButton = new Button("add");
hBox.getChildren().addAll(text, todoItemInput, addButton);
VBox vBox = new VBox(20);
todoItemList = new VBox(5);
ScrollPane scrollPane = new ScrollPane();
scrollPane.setContent(todoItemList);
scrollPane.setPrefSize(200, 200);
vBox.getChildren().add(hBox);
vBox.getChildren().add(scrollPane);
totalItem = new Text();
text = new Text("Total item:");
HBox hBoxNumberItem = new HBox(10);
hBoxNumberItem.getChildren().addAll(text, totalItem);
totalItem.setText(String.valueOf(numberTotalItem));
vBox.getChildren().add(hBoxNumberItem);
uiRoot.getChildren().add(vBox);
return uiRoot;
}
public Group getRoot() {
return root;
}
public TextField getTodoItemInput() {
return todoItemInput;
}
public Button getAddButton() {
return addButton;
}
public VBox getTodoItemList() {
return todoItemList;
}
public void setNumberTotalItem(int numberTotalItem) {
this.numberTotalItem = numberTotalItem;
totalItem.setText(String.valueOf(numberTotalItem));
}
}
=== Controller.java ===
package com.mco;
import javafx.event.ActionEvent;
import javafx.scene.control.Button;
import javafx.scene.text.Text;
import java.util.ArrayList;
public class Controller {
private ArrayList model;
private UserInterface vue;
public Controller(ArrayList model, UserInterface vue) {
this.model = model;
this.vue = vue;
Button button = vue.getAddButton();
button.setOnAction(this::handleButtonAdd);
}
private void handleButtonAdd(ActionEvent actionEvent) {
String todoItemText = vue.getTodoItemInput().getText();
if (!todoItemText.equals("")) {
model.add(todoItemText);
vue.getTodoItemList().getChildren().add(new Text(todoItemText));
vue.setNumberTotalItem(model.size());
}
}
}
===== Mise à jour du modèle =====
=== Main.java ===
package com.mco;
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.stage.Stage;
import java.util.ArrayList;
public class Main extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) throws Exception {
// on met en place la racine de la scène
Group root = new Group();
Scene theScene = new Scene(root);
primaryStage.setScene(theScene);
//Vue
UserInterface userInterface = new UserInterface();
root.getChildren().add(userInterface.getRoot());
//Modèle
ArrayList todoList = new ArrayList<>();
//Contrôleur
Controller controller = new Controller(todoList, userInterface);
//Affichage de l'UI
primaryStage.setTitle("Todo List");
primaryStage.show();
}
}
=== TodoItem.java ===
package com.mco;
import java.util.Date;
public class TodoItem {
private String name;
private Date creation;
public TodoItem(String name) {
this.name = name;
creation = new Date();
}
public String getName() {
return name;
}
public Date getCreation() {
return creation;
}
}
=== UserIterface.java ===
package com.mco;
import javafx.scene.Group;
import javafx.scene.control.Button;
import javafx.scene.control.ScrollPane;
import javafx.scene.control.TextField;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.text.Text;
public class UserInterface {
private Group root;
private TextField todoItemInput;
private Button addButton;
private VBox todoItemList;
private Text totalItem;
private int numberTotalItem;
public UserInterface() {
numberTotalItem = 0;
root = generateUI();
}
private Group generateUI() {
Group uiRoot = new Group();
HBox hBox = new HBox(10);
Text text = new Text("Input:");
todoItemInput = new TextField();
addButton = new Button("add");
hBox.getChildren().addAll(text, todoItemInput, addButton);
VBox vBox = new VBox(20);
todoItemList = new VBox(5);
ScrollPane scrollPane = new ScrollPane();
scrollPane.setContent(todoItemList);
scrollPane.setPrefSize(300, 200);
vBox.getChildren().add(hBox);
vBox.getChildren().add(scrollPane);
totalItem = new Text();
text = new Text("Total item:");
HBox hBoxNumberItem = new HBox(10);
hBoxNumberItem.getChildren().addAll(text, totalItem);
totalItem.setText(String.valueOf(numberTotalItem));
vBox.getChildren().add(hBoxNumberItem);
uiRoot.getChildren().add(vBox);
return uiRoot;
}
public void addTodoItem(TodoItem item) {
HBox hBox = new HBox(20);
hBox.getChildren().addAll(new Text(item.getName()),
new Text(item.getCreation().toString()));
todoItemList.getChildren().add(hBox);
}
public Group getRoot() {
return root;
}
public TextField getTodoItemInput() {
return todoItemInput;
}
public Button getAddButton() {
return addButton;
}
public VBox getTodoItemList() {
return todoItemList;
}
public void setNumberTotalItem(int numberTotalItem) {
this.numberTotalItem = numberTotalItem;
totalItem.setText(String.valueOf(numberTotalItem));
}
}
=== Controller.java ===
package com.mco;
import javafx.event.ActionEvent;
import javafx.scene.control.Button;
import java.util.ArrayList;
public class Controller {
private ArrayList model;
private UserInterface vue;
public Controller(ArrayList model, UserInterface vue) {
this.model = model;
this.vue = vue;
Button button = vue.getAddButton();
button.setOnAction(this::handleButtonAdd);
}
private void handleButtonAdd(ActionEvent actionEvent) {
String todoItemText = vue.getTodoItemInput().getText();
if (!todoItemText.equals("")) {
TodoItem item = new TodoItem(todoItemText);
model.add(item);
vue.addTodoItem(item);
vue.setNumberTotalItem(model.size());
}
}
}
===== Mise à jour de la vue =====
Seul UserInterface a été impacté.
=== UserInterface.java ===
package com.mco;
import javafx.scene.Group;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.layout.VBox;
public class UserInterface {
private Group root;
private InputTodoItemUI inputTodoItemUI;
private TodoListUI todoListUI;
private SummaryUI summaryUI;
public UserInterface() {
root = generateUI();
}
private Group generateUI() {
Group uiRoot = new Group();
VBox vBox = new VBox(20);
inputTodoItemUI = new InputTodoItemUI();
todoListUI = new TodoListUI();
summaryUI = new SummaryUI();
vBox.getChildren().addAll(
inputTodoItemUI.getRoot(),
todoListUI.getRoot(),
summaryUI.getRoot()
);
uiRoot.getChildren().add(vBox);
return uiRoot;
}
public void addTodoItem(TodoItem item) {
todoListUI.addTodoItem(item);
}
public Group getRoot() {
return root;
}
public TextField getTodoItemInput() {
return inputTodoItemUI.getTodoItemInput();
}
public Button getAddButton() {
return inputTodoItemUI.getAddButton();
}
public void setNumberTotalItem(int numberTotalItem) {
summaryUI.setNumberTotalItem(numberTotalItem);
}
}
=== InputTodoItemUI.java ===
package com.mco;
import javafx.scene.Group;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.layout.HBox;
import javafx.scene.text.Text;
public class InputTodoItemUI {
private Group root;
private TextField todoItemInput;
private Button addButton;
public InputTodoItemUI() {
root = new Group();
HBox hBox = new HBox(10);
Text text = new Text("Input:");
todoItemInput = new TextField();
addButton = new Button("add");
hBox.getChildren().addAll(text, todoItemInput, addButton);
root.getChildren().add(hBox);
}
public Group getRoot() {
return root;
}
public TextField getTodoItemInput() {
return todoItemInput;
}
public Button getAddButton() {
return addButton;
}
}
=== TodoListUI.java ===
package com.mco;
import javafx.scene.Group;
import javafx.scene.control.ScrollPane;
import javafx.scene.layout.VBox;
public class TodoListUI {
private Group root;
private VBox todoItemList;
public TodoListUI() {
root = new Group();
todoItemList = new VBox(5);
ScrollPane scrollPane = new ScrollPane();
scrollPane.setContent(todoItemList);
scrollPane.setPrefSize(300, 200);
root.getChildren().add(scrollPane);
}
public void addTodoItem(TodoItem item) {
TodoItemUI todoItemUI = new TodoItemUI(item);
todoItemList.getChildren().add(todoItemUI.getRoot());
}
public Group getRoot() {
return root;
}
}
=== TodoItemUI.java ===
package com.mco;
import javafx.scene.Group;
import javafx.scene.layout.HBox;
import javafx.scene.text.Text;
public class TodoItemUI {
private Group root;
public TodoItemUI(TodoItem item) {
root = new Group();
HBox hBox = new HBox(20);
hBox.getChildren().addAll(
new Text(item.getName()),
new Text(item.getCreation().toString())
);
root.getChildren().add(hBox);
}
public Group getRoot() {
return root;
}
}
=== SummaryUI.java ===
package com.mco;
import javafx.scene.Group;
import javafx.scene.layout.HBox;
import javafx.scene.text.Text;
public class SummaryUI {
private Group root;
private Text totalItem;
private int numberTotalItem;
public SummaryUI() {
root = new Group();
numberTotalItem = 0;
totalItem = new Text();
Text text = new Text("Total item:");
HBox hBoxNumberItem = new HBox(10);
hBoxNumberItem.getChildren().addAll(text, totalItem);
totalItem.setText(String.valueOf(numberTotalItem));
root.getChildren().add(hBoxNumberItem);
}
public Group getRoot() {
return root;
}
public void setNumberTotalItem(int numberTotalItem) {
this.numberTotalItem = numberTotalItem;
totalItem.setText(String.valueOf(numberTotalItem));
}
}