Table des matières

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<String> model;
    private UserInterface vue;

    public Controller(ArrayList<String> 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 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<String> model;
    private UserInterface vue;

    public Controller(ArrayList<String> 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<String> model;
    private UserInterface vue;

    public Controller(ArrayList<String> 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<TodoItem> 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<TodoItem> model;
    private UserInterface vue;

    public Controller(ArrayList<TodoItem> 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));
    }

}