'JavaFX table sort after adding new entry
I have a table which has an ObservableList bound to it. The table is sorted in a descending order, but whenever an object is added to the list the entry is added to the table but the sorting is not maintained.
public class ActivityLogController {
@FXML
private TableView<Activity> activityLogTable;
@FXML
private TableColumn<Activity, ActivityType> type;
@FXML
private TableColumn<Activity, String> activity;
@FXML
private TableColumn<Activity, ActivitySource> source;
@FXML
private TableColumn<Activity, LocalDateTime> timestamp;
public void loadController(){
TableRowExpanderColumn<Activity> column = new TableRowExpanderColumn<>(this::createEditor);
setColumnProperties();
activityLogTable.getColumns().add(0, column);
activityLogTable.setItems(ActivityHandler.getInstance().getActivityObservableList());
timestamp.setSortType(TableColumn.SortType.DESCENDING);
activityLogTable.getSortOrder().add(timestamp);
activityLogTable.sort();
}
private HBox createEditor(TableRowExpanderColumn.TableRowDataFeatures<Activity> param){
HBox hBox = new HBox();
hBox.setAlignment(Pos.BASELINE_LEFT);
hBox.setPadding(new Insets(10, 0, 10, 125));
Activity activity = param.getValue();
Label label = new Label(activity.getDetails());
hBox.getChildren().setAll(label);
return hBox;
}
private void setColumnProperties(){
type.setCellValueFactory(new PropertyValueFactory<>("type"));
type.setCellFactory(col -> new TableCell<Activity, ActivityType>() {
private final ImageView imageView = new ImageView();
@Override
protected void updateItem(ActivityType type, boolean empty) {
super.updateItem(type, empty) ;
if (empty) {
setGraphic(null);
} else {
imageView.setFitHeight(16);
imageView.setFitWidth(16);
imageView.setImage(type.image);
setGraphic(imageView);
this.setAlignment(Pos.TOP_CENTER);
}
}
});
activity.setCellValueFactory((tf -> new ReadOnlyStringWrapper(tf.getValue().getActivity())));
source.setCellValueFactory(new PropertyValueFactory<>("source"));
timestamp.setCellValueFactory(new PropertyValueFactory<>("timeStamp"));
}
}
public final class ActivityHandler {
private static ActivityHandler INSTANCE;
public static ActivityHandler getInstance() {
if(INSTANCE == null) {
INSTANCE = new ActivityHandler();
}
return INSTANCE;
}
public static void setInstance(ActivityHandler a){
INSTANCE = a;
}
private static final String ACTIVITY_LOG = "CONFIG/activityLog.json";
private ObservableList<Activity> activityObservableList;
public ObservableList<Activity> getActivityObservableList() {
return activityObservableList;
}
public void setActivityObservableList(ObservableList<Activity> activityObservableList) {
this.activityObservableList = activityObservableList;
}
public void addActivity(Activity activity){
LocalDateTime time = activity.getTimeStamp();
activityObservableList.add(activity);
activityObservableList.removeIf(a -> a.getTimeStamp().isBefore(time.minus(Period.ofDays(1))));
System.out.println("added activity " + activity.getActivity());
Platform.runLater(this::serializeActivityLog);
}
public void serializeActivityLog(){
Gson gson = new Gson();
try {
Writer writer = new FileWriter(ACTIVITY_LOG);
gson.toJson(activityObservableList, writer);
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public void deserializeActivityLog(){
Gson gson = new Gson();
try {
Type typeOfList = new TypeToken<ArrayList<Activity>>() { }.getType();
ArrayList arrayList = gson.fromJson(new FileReader(ACTIVITY_LOG), typeOfList);
if(arrayList == null){
arrayList = new ArrayList();
}
activityObservableList = FXCollections.observableArrayList(arrayList);
} catch (FileNotFoundException e) {
serializeActivityLog();
e.printStackTrace();
}
}
}
Is there a way to maintain the sorting after a new object is added to the list?
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|
