Guest User

Untitled

a guest
May 1st, 2023
9
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.29 KB | None | 0 0
  1. package ch.epfl.javions.gui;
  2.  
  3. import ch.epfl.javions.Units;
  4. import ch.epfl.javions.adsb.CallSign;
  5. import javafx.beans.property.ObjectProperty;
  6. import javafx.beans.property.ReadOnlyDoubleWrapper;
  7. import javafx.beans.property.ReadOnlyObjectWrapper;
  8. import javafx.collections.FXCollections;
  9. import javafx.collections.ObservableList;
  10. import javafx.collections.ObservableSet;
  11. import javafx.collections.SetChangeListener;
  12. import javafx.scene.Node;
  13. import javafx.scene.control.TableColumn;
  14. import javafx.scene.control.TableView;
  15.  
  16. import java.text.NumberFormat;
  17. import java.text.ParseException;
  18. import java.util.List;
  19. import java.util.function.Consumer;
  20.  
  21.  
  22. public final class AircraftTableController {
  23.     private final ObservableSet<ObservableAircraftState>  aircraftStates;
  24.     private final ObjectProperty<ObservableAircraftState> selectedAircraftState;
  25.  
  26.     private final TableView<ObservableAircraftState> tableView;
  27.  
  28.     public AircraftTableController(ObservableSet<ObservableAircraftState> aircraftStates,
  29.                                    ObjectProperty<ObservableAircraftState> selectedAircraftState) {
  30.         this.aircraftStates        = FXCollections.unmodifiableObservableSet(aircraftStates);
  31.         this.selectedAircraftState = selectedAircraftState;
  32.         ObservableList<ObservableAircraftState> list = FXCollections.observableArrayList(aircraftStates);
  33.         tableView = new TableView<>(list);
  34.         tableView.getStylesheets().add("table.css");
  35.         tableView.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY_SUBSEQUENT_COLUMNS);
  36.         tableView.setTableMenuButtonVisible(true);
  37.         buildTable();
  38.         aircraftStates.addListener((SetChangeListener<ObservableAircraftState>) change -> {
  39.             if (change.wasAdded()) {
  40.                 // Add the value to each column cell of the tableView
  41.                 tableView.getItems().add(change.getElementAdded());
  42.             }
  43.             else if (change.wasRemoved()) {
  44.                 tableView.getItems().remove(change.getElementRemoved());
  45.  
  46.             }
  47.         });
  48.     }
  49.  
  50.     public Node pane() {
  51.         return tableView;
  52.     }
  53.  
  54.     public void setOnDoubleClick(Consumer<ObservableAircraftState> onDoubleClick) {
  55.         tableView.setOnMouseClicked(event -> {
  56.             if (event.getClickCount() == 2 && tableView.getSelectionModel().getSelectedItem() != null) {
  57.                 onDoubleClick.accept(tableView.getSelectionModel().getSelectedItem());
  58.             }
  59.         });
  60.     }
  61.  
  62.     private void buildTable() {
  63.         tableView.getColumns().addAll(
  64.                 createStringColumn("OACI", "numeric", 60, f -> f.getValue().getIcaoAddress().string()),
  65.                 createStringColumn("Indicatif", null, 70, f -> f.getValue().callSignProperty().map(CallSign::string)),
  66.                 createStringColumn("Immatriculation", null, 90, f -> f.getValue().getData() != null ?
  67.                         f.getValue().getData().registration().string() : ""),
  68.                 createStringColumn("Modèle", null, 230, f -> f.getValue().getData() != null ?
  69.                         f.getValue().getData().model() : ""),
  70.                 createStringColumn("Type", null, 50, f -> f.getValue().getData() != null ?
  71.                         f.getValue().getData().typeDesignator().string() : ""),
  72.                 createStringColumn("Description", null, 70, f -> f.getValue().getData() != null ?
  73.                         f.getValue().getData().description().string() : ""),
  74.                 createNumericColumn("Latitude (°)", "numeric", f -> Units.convertTo(f.getValue().positionProperty().get().latitude(), Units.Angle.DEGREE)),
  75.                 createNumericColumn("Longitude (°)", "numeric", f -> Units.convertTo(f.getValue().positionProperty().get().longitude(), Units.Angle.DEGREE)),
  76.                 createNumericColumn("Altitude (m)", "numeric", f -> f.getValue().positionProperty().get().altitude())
  77.         );
  78.     }
  79.  
  80.     private <T> TableColumn<ObservableAircraftState, String> createStringColumn(String name, String styleClass, double prefWidth,
  81.                                                                                 ObservableValue<T> observableValue) {
  82.         TableColumn<ObservableAircraftState, String> column = new TableColumn<>(name);
  83.         column.setCellValueFactory(f -> new ReadOnlyObjectWrapper<>(observableValue.getValue().toString()));
  84.         column.setPrefWidth(prefWidth);
  85.         if (styleClass != null) {
  86.             column.getStyleClass().add(styleClass);
  87.         }
  88.         return column;
  89.     }
  90.  
  91.     private TableColumn<ObservableAircraftState, String> createNumericColumn(String name, String styleClass,
  92.                                                                              ObservableValue<Number> observableValue) {
  93.         TableColumn<ObservableAircraftState, String> column = new TableColumn<>(name);
  94.         column.setCellValueFactory(f -> {
  95.             NumberFormat format = NumberFormat.getInstance();
  96.             format.setMinimumFractionDigits(4);
  97.             format.setMaximumFractionDigits(4);
  98.             ReadOnlyDoubleWrapper wrapper = new ReadOnlyDoubleWrapper(observableValue.getValue().doubleValue());
  99.             return wrapper.map(format::format);
  100.         });
  101.         column.getStyleClass().add(styleClass);
  102.         setComparator(column);
  103.         return column;
  104.     }
  105.  
  106. }
  107.  
Advertisement
Add Comment
Please, Sign In to add comment