Populate TableView with ObservableMap JavaFX


I wanted to know if it is possible to use a ObservableMap to populate a TableView ? I use ObservableMap instead of ObservableList because I need to add and delete often, so I need to minimize the cost.

My hashMap use an BigInteger as key field and a type with many properties as value field. In my tableView I just want to display the values with a column per properties. I hope that is clear


6/6/2013 12:15:49 PM

I've been trying to do this. I guess the post is old but I don't see any answers anywhere on the net. The examples use the map key for columns and then a list of maps for every row. I'd like to see the rows as keys and their associated values. It's a long example.

package tablemap;

import static java.lang.Math.random;
import java.util.Map;
import java.util.TreeMap;
import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableColumn.CellEditEvent;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.TextFieldTableCell;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class TableMap extends Application {

    public void start(Stage primaryStage) {
        VBox root = new VBox();
        Map<String,LineItem> mapData = new TreeMap<>();
        for (int i = 0; i < 3; i++)
            mapData.put(String.valueOf(random()), new LineItem(String.valueOf(i),"i"));

        ObservableList<Map.Entry<String,LineItem>> listData = 
        TableView<Map.Entry<String,LineItem>> tv = new TableView(listData);

        TableColumn<Map.Entry<String,LineItem>,String> keyCol = new TableColumn("Key");
            (TableColumn.CellDataFeatures<Map.Entry<String,LineItem>, String> p) -> 
                new SimpleStringProperty(p.getValue().getKey()));

        TableColumn<Map.Entry<String,LineItem>,String> lineNoCol = new TableColumn("Line No");
            (TableColumn.CellDataFeatures<Map.Entry<String,LineItem>, String> p) -> 
                new SimpleStringProperty(p.getValue().getValue().getLineNo()));

        TableColumn<Map.Entry<String,LineItem>,String> descCol = new TableColumn("Desc");
            (TableColumn.CellDataFeatures<Map.Entry<String,LineItem>, String> p) -> 
                new SimpleStringProperty(p.getValue().getValue().getDesc()));


        descCol.setOnEditCommit((CellEditEvent<Map.Entry<String,LineItem>, String> t) -> {

        tv.getColumns().addAll(keyCol,lineNoCol, descCol);

        Button btnOut = new Button("out");
        btnOut.setOnAction(new EventHandler<ActionEvent>() {
            public void handle(ActionEvent t) {
                for (Map.Entry<String,LineItem> me : mapData.entrySet()){
                    System.out.println("key "+me.getKey()+" entry "+me.getValue().toCSVString());
                for (Map.Entry<String,LineItem> me : listData){
                    System.out.println("key "+me.getKey()+" entry "+me.getValue().toCSVString());

        Scene scene = new Scene(root, 300, 200);

        primaryStage.setTitle("Map Table Test");

And the LineItem Class Code

package tablemap;

import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;

/* LineItem class */

public class LineItem {
    private final StringProperty lineNo = new SimpleStringProperty();
    private final StringProperty desc = new SimpleStringProperty();

    public LineItem(String ln, String dsc) {
        lineNo.set(ln); desc.set(dsc);

    public String getLineNo() {return (lineNo.getValue() != null) ?lineNo.get():"";}
    public void setLineNo(String lineNo) {this.lineNo.set(lineNo);}
    public StringProperty lineNoProperty() {return lineNo;}

    public String getDesc() {return (desc.getValue() != null) ?desc.get():"";}
    public void setDesc(String desc) {this.desc.set(desc);}
    public StringProperty descProperty() {return desc;}

    public String toCSVString(){
        return lineNo.getValueSafe()+","+

You can see after editing data and clicking out that changes in the list are reflected in the map. I still have to check the other way and handle insertions and deletions but that shouldn't be to hard.

4/27/2016 11:44:52 AM

Licensed under: CC-BY-SA with attribution
Not affiliated with: Stack Overflow