Source:
public void initialize(URL location, ResourceBundle resources) { logCategoryColumn.setCellValueFactory(new PropertyValueFactory<>("category")); logMessageColumn.setCellValueFactory(new PropertyValueFactory<>("message")); final DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); logDateColumn.setCellValueFactory( entry -> new SimpleObjectProperty<>(entry.getValue().getTimestamp())); logDateColumn.setCellFactory(column -> new TableCell<LogEntry, Date>() { @Override protected void updateItem(Date item, boolean empty) { super.updateItem(item, empty); if (item == null || empty) { setText(null); setGraphic(null); } else { setText(dateFormat.format(item)); } } }); EventStream<LogEntry> e1 = designerRoot.getLogger().getLog() .filter(x -> x.getCategory().equals(Category.PARSE_EXCEPTION)) .successionEnds(Duration.ofMillis(1000)); EventStream<LogEntry> e2 = designerRoot.getLogger().getLog() .filter(x -> !x.getCategory().equals(Category.PARSE_EXCEPTION)); EventStreams.merge(e1, e2) .subscribe(t -> eventLogTableView.getItems().add(t)); eventLogTableView .getSelectionModel() .selectedItemProperty() .addListener((obs, oldVal, newVal) -> logDetailsTextArea.setText( newVal == null ? "" : newVal.getStackTrace())); eventLogTableView.resizeColumn(logMessageColumn, -1); logMessageColumn.prefWidthProperty() .bind(eventLogTableView.widthProperty() .subtract(logCategoryColumn.getPrefWidth()) .subtract(logDateColumn.getPrefWidth()) .subtract(2)); logDateColumn.setSortType(SortType.DESCENDING); }

Target:
public void initialize(URL location, ResourceBundle resources) { logCategoryColumn.setCellValueFactory(new PropertyValueFactory<>("category")); logMessageColumn.setCellValueFactory(new PropertyValueFactory<>("message")); final DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); logDateColumn.setCellValueFactory( entry -> new SimpleObjectProperty<>(entry.getValue().getTimestamp())); logDateColumn.setCellFactory(column -> new TableCell<LogEntry, Date>() { @Override protected void updateItem(Date item, boolean empty) { super.updateItem(item, empty); if (item == null || empty) { setText(null); setGraphic(null); } else { setText(dateFormat.format(item)); } } }); EventStream<LogEntry> onlyParseException = designerRoot.getLogger().getLog() .filter(x -> x.getCategory() == Category.PARSE_EXCEPTION) .successionEnds(PARSE_EXCEPTION_DELAY); EventStream<LogEntry> otherExceptions = designerRoot.getLogger().getLog() .filter(x -> x.getCategory() != Category.PARSE_EXCEPTION) .filter(y -> y.getCategory() != Category.XPATH_EVALUATION_EXCEPTION); EventStream<LogEntry> onlyXPathException = designerRoot.getLogger().getLog() .filter(x -> x.getCategory() == Category.XPATH_EVALUATION_EXCEPTION) .successionEnds(PARSE_EXCEPTION_DELAY); EventStreams.merge(onlyParseException, otherExceptions, onlyXPathException) .subscribe(t -> eventLogTableView.getItems().add(t)); eventLogTableView .getSelectionModel() .selectedItemProperty() .addListener((obs, oldVal, newVal) -> logDetailsTextArea.setText( newVal == null ? "" : newVal.getStackTrace())); eventLogTableView.resizeColumn(logMessageColumn, -1); logMessageColumn.prefWidthProperty() .bind(eventLogTableView.widthProperty() .subtract(logCategoryColumn.getPrefWidth()) .subtract(logDateColumn.getPrefWidth()) .subtract(2)); logDateColumn.setSortType(SortType.DESCENDING); }