Java tutorial
import javafx.application.Application; import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.StringProperty; import javafx.beans.value.ObservableValue; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.geometry.HPos; import javafx.geometry.Insets; import javafx.scene.Scene; import javafx.scene.control.Label; import javafx.scene.control.ListCell; import javafx.scene.control.ListView; import javafx.scene.control.TableColumn; import javafx.scene.control.TableView; import javafx.scene.control.Tooltip; import javafx.scene.control.cell.PropertyValueFactory; import javafx.scene.layout.BorderPane; import javafx.scene.layout.GridPane; import javafx.scene.paint.Color; import javafx.stage.Stage; import javafx.util.Callback; public class Main extends Application { private ObservableList<Person> getPeople() { ObservableList<Person> people = FXCollections.<Person>observableArrayList(); Person docX = new Person("Programmer", "A", "B"); docX.employeesProperty().add(new Person("XML", "J", "H")); docX.employeesProperty().add(new Person("CSS", "S", "S")); docX.employeesProperty().add(new Person("HTML", "O", "M")); Person magneto = new Person("Tester", "M", "E"); Person biker = new Person("Manager", "J", "G"); people.addAll(docX, magneto, biker); return people; } private ListView<Person> createLeaderListView(ObservableList<Person> leaders) { final ListView<Person> leaderListView = new ListView<>(leaders); leaderListView.setPrefWidth(150); leaderListView.setMaxWidth(Double.MAX_VALUE); leaderListView.setPrefHeight(150); leaderListView.setCellFactory(new Callback<ListView<Person>, ListCell<Person>>() { @Override public ListCell<Person> call(ListView<Person> param) { Tooltip tooltip = new Tooltip(); ListCell<Person> cell = new ListCell<Person>() { @Override public void updateItem(Person item, boolean empty) { super.updateItem(item, empty); if (item != null) { // leadLbl.setText(item.getAliasName()); setText(item.getFirstName() + " " + item.getLastName()); tooltip.setText(item.getAliasName()); setTooltip(tooltip); } } }; return cell; } }); return leaderListView; } private TableView<Person> createEmployeeTableView(ObservableList<Person> teamMembers) { final TableView<Person> employeeTableView = new TableView<>(); employeeTableView.setPrefWidth(300); employeeTableView.setItems(teamMembers); TableColumn<Person, String> aliasNameCol = new TableColumn<>("Alias"); TableColumn<Person, String> firstNameCol = new TableColumn<>("First Name"); TableColumn<Person, String> lastNameCol = new TableColumn<>("Last Name"); aliasNameCol.setEditable(true); aliasNameCol.setPrefWidth(employeeTableView.getPrefWidth() / 3); firstNameCol.setPrefWidth(employeeTableView.getPrefWidth() / 3); lastNameCol.setPrefWidth(employeeTableView.getPrefWidth() / 3); aliasNameCol.setCellValueFactory(new PropertyValueFactory<Person, String>("aliasName")); firstNameCol.setCellValueFactory(new PropertyValueFactory<Person, String>("firstName")); lastNameCol.setCellValueFactory(new PropertyValueFactory<Person, String>("lastName")); employeeTableView.getColumns().setAll(aliasNameCol, firstNameCol, lastNameCol); return employeeTableView; } @Override public void start(Stage primaryStage) { BorderPane root = new BorderPane(); Scene scene = new Scene(root, 500, 250, Color.WHITE); GridPane gridpane = new GridPane(); gridpane.setPadding(new Insets(5)); gridpane.setHgap(10); gridpane.setVgap(10); root.setCenter(gridpane); ObservableList<Person> leaders = getPeople(); final ObservableList<Person> teamMembers = FXCollections.observableArrayList(); ListView<Person> leaderListView = createLeaderListView(leaders); TableView<Person> employeeTableView = createEmployeeTableView(teamMembers); Label bossesLbl = new Label("Boss"); GridPane.setHalignment(bossesLbl, HPos.CENTER); gridpane.add(bossesLbl, 0, 0); gridpane.add(leaderListView, 0, 1); Label emplLbl = new Label("Employees"); GridPane.setHalignment(emplLbl, HPos.CENTER); gridpane.add(emplLbl, 2, 0); gridpane.add(employeeTableView, 2, 1); leaderListView.getSelectionModel().selectedItemProperty() .addListener((ObservableValue<? extends Person> observable, Person oldValue, Person newValue) -> { if (observable != null && observable.getValue() != null) { teamMembers.clear(); teamMembers.addAll(observable.getValue().employeesProperty()); } }); primaryStage.setScene(scene); primaryStage.show(); } public static void main(String[] args) { launch(args); } public static class Person { private StringProperty aliasName; private StringProperty firstName; private StringProperty lastName; private ObservableList<Person> employees = FXCollections.observableArrayList(); public Person(String alias, String firstName, String lastName) { this.setAliasName(alias); this.setFirstName(firstName); this.setLastName(lastName); } public final void setAliasName(String value) { aliasNameProperty().set(value); } public final String getAliasName() { return aliasNameProperty().get(); } public StringProperty aliasNameProperty() { if (aliasName == null) { aliasName = new SimpleStringProperty(); } return aliasName; } public final void setFirstName(String value) { firstNameProperty().set(value); } public final String getFirstName() { return firstNameProperty().get(); } public StringProperty firstNameProperty() { if (firstName == null) { firstName = new SimpleStringProperty(); } return firstName; } public final void setLastName(String value) { lastNameProperty().set(value); } public final String getLastName() { return lastNameProperty().get(); } public StringProperty lastNameProperty() { if (lastName == null) { lastName = new SimpleStringProperty(); } return lastName; } public ObservableList<Person> employeesProperty() { return employees; } } }