public void setCrashReport(CrashReport crashReport) { stackTraceView.populateFromCrashReport(crashReport); termTreeView.populateFromTerm(crashReport.getProps()); Object[][] crashProps = { {"Pid", crashReport.getPid()}, {"Reg. Name", crashReport.getRegisteredName()}, { "Error", ErlyBerly.getTermFormatter() .exceptionToString(crashReport.getErrorClass(), crashReport.getErrorReason()) }, { "Initial Call", ErlyBerly.getTermFormatter() .modFuncArgsToString((OtpErlangTuple) crashReport.getProcessInitialCall()) } }; TableColumn<Object[], Object> keyColumn = new TableColumn<>("Key"); TableColumn<Object[], Object> valueColumn = new TableColumn<>("Value"); keyColumn.setCellValueFactory( new Callback<CellDataFeatures<Object[], Object>, ObservableValue<Object>>() { @Override public ObservableValue<Object> call(CellDataFeatures<Object[], Object> p) { return new SimpleObjectProperty<>((p.getValue()[0])); } }); valueColumn.setCellValueFactory( new Callback<CellDataFeatures<Object[], Object>, ObservableValue<Object>>() { @Override public ObservableValue<Object> call(CellDataFeatures<Object[], Object> p) { return new SimpleObjectProperty<>((p.getValue()[1])); } }); crashInfoTable.getColumns().add(keyColumn); crashInfoTable.getColumns().add(valueColumn); crashInfoTable.getItems().addAll(crashProps); crashReport .getCallArgs() .ifPresent( (callArgs) -> { argsTreeView.populateFromListContents(callArgs); }); }