JavaFX custom listview

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.geometry.Pos;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.scene.image.ImageView;
import javafx.scene.layout.HBox;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

/**
 * JavaFX App
 */
public class App extends Application {

  public static void main(String[] args) {
    launch();
  }

  @Override
  public void start(Stage stage) {

    // La vue de la liste
    ListView < Contact > contactsListView = new ListView < Contact > ();

    // La liste contenant les contacts
    ObservableList < Contact > contactObservableList = FXCollections.observableArrayList();

    // Ajoute la liste dans la vue de liste
    contactsListView.setItems(contactObservableList);

    // Ajoute les contacts à la liste
    contactObservableList.addAll(new Contact("avatar1.png", "Samantha King"),
      new Contact("avatar2.png", "Baker Hall"), new Contact("avatar3.png", "Sienna Hamilton"));

    // La cellule de liste customisée
    contactsListView.setCellFactory(item -> new ContactCell());

    var scene = new Scene(new StackPane(contactsListView), 640, 480);
    stage.setScene(scene);
    stage.show();
  }

}

class ContactCell extends ListCell < Contact > {

  @Override
  protected void updateItem(Contact contact, boolean empty) {
    // Rafraichissement l'élément sélectionné
    super.updateItem(contact, empty);

    // Si vide ou nul
    if (empty || contact == null) {
      // Rien à afficher
      setGraphic(null);
      setText(null);
    } else {

      // HBox contenant le contact (image + nom)
      HBox root = new HBox();
      root.setSpacing(10);
      // Centre le label au centre gauche
      root.setAlignment(Pos.CENTER_LEFT);

      ObservableList < Node > children = root.getChildren();

      // L'image du contact
      ImageView avatarImageView = new ImageView(contact.getImagePath());
      avatarImageView.setFitWidth(75);
      avatarImageView.setFitHeight(75);

      // Le nom
      Label nameLabel = new Label(contact.getName());
      nameLabel.setStyle("-fx-font-size: 18px;");

      // Ajoute les éléments
      children.add(avatarImageView);
      children.add(nameLabel);

      // Affiche l'item
      setGraphic(root);
    }
  }
}

// La classe contact pour les données
class Contact {

  private String imagePath;
  private String name;

  public Contact(String imagePath, String name) {
    this.imagePath = imagePath;
    this.name = name;
  }

  public String getImagePath() {
    return imagePath;
  }

  public String getName() {
    return name;
  }

}

Commentaires