Search in sources :

Example 6 with Review

use of retrospector.model.Review in project Retrospector by NonlinearFruit.

the class CategorySectionController method updateCategory.

private void updateCategory() {
    // Category Chooser
    String category = categorySelector.getValue();
    // Data Mining - Vars
    Map<String, Integer> reviewMap = new HashMap<>();
    int[] reviewsPerRating = new int[DataManager.getMaxRating() + 1];
    InfoBlipAccumulator info = new InfoBlipAccumulator();
    // Data Mining - Calcs
    for (Media m : allMedia) {
        if (category.equals(m.getCategory())) {
            info.accumulate(m);
            for (Review r : m.getReviews()) {
                reviewsPerRating[r.getRating().intValue()] += 1;
                String key = r.getDate().getMonthValue() + "-" + r.getDate().getYear();
                reviewMap.put(key, reviewMap.getOrDefault(key, 0) + 1);
                info.accumulate(r);
            }
        }
    }
    // Stats
    statsBox.getChildren().clear();
    statsBox.getChildren().add(info.getInfo());
    // Chart - # Reviewed / Year
    chartReviewsPerYear.setLegendVisible(false);
    chartReviewsPerYear.getData().clear();
    XYChart.Series data = new XYChart.Series();
    int year = info.getEarliest().getYear();
    int month = info.getEarliest().getMonthValue();
    for (int i = 0; i <= ChronoUnit.MONTHS.between(info.getEarliest(), LocalDate.now()) + 1; i++) {
        String key = month + "-" + year;
        data.getData().add(new XYChart.Data(key, reviewMap.getOrDefault(key, 0)));
        ++month;
        if (month > 12) {
            month = 1;
            ++year;
        }
        if (year >= LocalDate.now().getYear() && month > LocalDate.now().getMonthValue()) {
            break;
        }
    }
    chartReviewsPerYear.getData().addAll(data);
    // Chart - # Reviews / Rating
    data = new XYChart.Series();
    for (int i = 1; i < reviewsPerRating.length; i++) {
        data.getData().add(new XYChart.Data(i + "", reviewsPerRating[i]));
    }
    chartReviewsPerRating.getData().clear();
    chartReviewsPerRating.getData().add(data);
}
Also used : HashMap(java.util.HashMap) Media(retrospector.model.Media) Review(retrospector.model.Review) XYChart(javafx.scene.chart.XYChart)

Example 7 with Review

use of retrospector.model.Review in project Retrospector by NonlinearFruit.

the class StatsTabController method updateCategory.

private void updateCategory() {
    // Category Chooser
    String category = categorySelector.getValue();
    // Colors
    int index = Arrays.asList(DataManager.getCategories()).indexOf(category);
    if (category.equals(universalCategory))
        index = colors.length - 1;
    chartReviewsPerYear.setStyle("CHART_COLOR_1: " + colors[(index > 0 ? index : 0) % colors.length] + ";");
    chartReviewsPerRating.setStyle("CHART_COLOR_1: " + colors[(index > 0 ? index : 0) % colors.length] + ";");
    // Data Mining - Vars
    Map<String, Integer> reviewMap = new HashMap<>();
    int[] reviewsPerRating = new int[DataManager.getMaxRating() + 1];
    InfoBlipAccumulator info = new InfoBlipAccumulator();
    // Data Mining - Calcs
    for (Media m : allMedia) {
        if (category.equals(m.getCategory()) || category.equals(universalCategory)) {
            boolean used = false;
            for (Review r : m.getReviews()) {
                if (strooleans.stream().anyMatch(x -> x.getString().equalsIgnoreCase(r.getUser()) && x.isBoolean())) {
                    reviewsPerRating[r.getRating().intValue()] += 1;
                    String key = r.getDate().getMonthValue() + "-" + r.getDate().getYear();
                    reviewMap.put(key, reviewMap.getOrDefault(key, 0) + 1);
                    info.accumulate(r);
                    used = true;
                }
            }
            if (used) {
                info.accumulate(m);
                for (Factoid f : m.getFactoids()) {
                    info.accumulate(f);
                }
            }
        }
    }
    if (categoryContainer.getChildren().size() > 3)
        categoryContainer.getChildren().remove(2);
    categoryContainer.getChildren().add(2, info.getInfo());
    // Chart - # Reviewed / Year
    chartReviewsPerYear.setLegendVisible(false);
    chartReviewsPerYear.getData().clear();
    XYChart.Series data = new XYChart.Series();
    int year = info.getEarliest().getYear();
    int month = info.getEarliest().getMonthValue();
    for (int i = 0; i <= ChronoUnit.MONTHS.between(info.getEarliest(), LocalDate.now()) + 1; i++) {
        String key = month + "-" + year;
        data.getData().add(new XYChart.Data(key, reviewMap.getOrDefault(key, 0)));
        ++month;
        if (month > 12) {
            month = 1;
            ++year;
        }
        if (year >= LocalDate.now().getYear() && month > LocalDate.now().getMonthValue())
            break;
    }
    if (data.getData().size() < 1)
        data.getData().add(new XYChart.Data<>("", 0));
    chartReviewsPerYear.getData().addAll(data);
    // Chart - # Reviews / Rating
    data = new XYChart.Series();
    for (int i = 1; i < reviewsPerRating.length; i++) {
        data.getData().add(new XYChart.Data(i + "", reviewsPerRating[i]));
    }
    if (data.getData().size() < 1)
        data.getData().add(new XYChart.Data<>("", 0));
    chartReviewsPerRating.getData().clear();
    chartReviewsPerRating.getData().add(data);
}
Also used : HashMap(java.util.HashMap) Media(retrospector.model.Media) Review(retrospector.model.Review) XYChart(javafx.scene.chart.XYChart) Factoid(retrospector.model.Factoid)

Example 8 with Review

use of retrospector.model.Review in project Retrospector by NonlinearFruit.

the class StatsTabController method updateFactoid.

private void updateFactoid() {
    // Selector Values
    String factoidType = factoidSelector.getValue();
    String category = categorySelector.getValue();
    // Colors
    int index = Arrays.asList(DataManager.getFactiodTypes()).indexOf(factoidType);
    chartAverageFactRating.setStyle("CHART_COLOR_1: " + colors[(index >= 0 ? colors.length - index : 0) % colors.length] + ";");
    chartNumOfFacts.setStyle("CHART_COLOR_1: " + colors[(index >= 0 ? colors.length - index : 0) % colors.length] + ";");
    // Data Mining - Vars
    final Integer threshold = 5;
    final Integer maxLabelLen = 13;
    Map<String, Integer> ratingFactsMap = new HashMap<>();
    Map<String, Integer> countReviewFactsMap = new HashMap<>();
    Map<String, Integer> numberFactsMap = new HashMap<>();
    InfoBlipAccumulator info = new InfoBlipAccumulator();
    // Data Mining - Calcs
    for (Media m : allMedia) {
        List<Factoid> factoids = new ArrayList<>(m.getFactoids());
        factoids.add(new Factoid("Title", m.getTitle()));
        factoids.add(new Factoid("Creator", m.getCreator()));
        factoids.add(new Factoid("Season", m.getSeasonId()));
        factoids.add(new Factoid("Episode", m.getEpisodeId()));
        factoids.add(new Factoid("Category", m.getCategory()));
        if (category.equals(m.getCategory()) || category.equals(universalCategory)) {
            boolean user = false;
            boolean fact = false;
            for (Review r : m.getReviews()) if (strooleans.stream().anyMatch(x -> x.getString().equalsIgnoreCase(r.getUser()) && x.isBoolean()))
                user = true;
            for (Factoid factiod : factoids) if (factiod.getTitle().equals(factoidType))
                fact = true;
            if (user && fact) {
                Set<String> contentTypes = new HashSet<>();
                info.accumulate(m);
                SimpleIntegerProperty rating = new SimpleIntegerProperty(0);
                SimpleIntegerProperty count = new SimpleIntegerProperty(0);
                for (Review r : m.getReviews()) if (strooleans.stream().anyMatch(x -> x.getString().equalsIgnoreCase(r.getUser()) && x.isBoolean())) {
                    rating.set(rating.get() + r.getRating().intValueExact());
                    count.set(count.get() + 1);
                    info.accumulate(r);
                }
                for (Factoid factoid : factoids) if (factoid.getTitle().equals(factoidType)) {
                    String f = factoid.getContent();
                    if (f.length() > maxLabelLen)
                        f = f.substring(0, maxLabelLen);
                    contentTypes.add(f);
                    numberFactsMap.put(f, numberFactsMap.getOrDefault(f, 0) + 1);
                    info.accumulate(factoid);
                }
                contentTypes.stream().forEach(content -> {
                    ratingFactsMap.put(content, ratingFactsMap.getOrDefault(content, 0) + rating.get());
                    countReviewFactsMap.put(content, countReviewFactsMap.getOrDefault(content, 0) + count.get());
                });
            }
        }
    }
    if (mediaContainer.getChildren().size() > 3)
        mediaContainer.getChildren().remove(2);
    mediaContainer.getChildren().add(2, info.getInfo());
    // Chart - # of Facts
    chartNumOfFacts.getData().clear();
    XYChart.Series<String, Number> dataNum = new XYChart.Series<>();
    dataNum.setName(factoidType);
    numberFactsMap.keySet().stream().sorted(new NaturalOrderComparator()).forEachOrdered(factoid -> {
        if (numberFactsMap.get(factoid) > 1)
            dataNum.getData().add(new XYChart.Data<>(factoid, numberFactsMap.get(factoid)));
    });
    if (dataNum.getData().size() < 1)
        dataNum.getData().add(new XYChart.Data<>("", 0));
    chartNumOfFacts.getData().add(dataNum);
    // Chart - Average Fact Rating
    chartAverageFactRating.getData().clear();
    XYChart.Series<String, Number> dataAve = new XYChart.Series<>();
    dataAve.setName(factoidType);
    ratingFactsMap.keySet().stream().sorted(new NaturalOrderComparator()).forEachOrdered(factoid -> {
        if (countReviewFactsMap.get(factoid) >= threshold)
            dataAve.getData().add(new XYChart.Data<>(factoid, ratingFactsMap.get(factoid) * 1.0 / countReviewFactsMap.get(factoid)));
    });
    if (dataAve.getData().size() < 1)
        dataAve.getData().add(new XYChart.Data<>("", 0));
    chartAverageFactRating.getData().add(dataAve);
}
Also used : Arrays(java.util.Arrays) Initializable(javafx.fxml.Initializable) ListView(javafx.scene.control.ListView) StackedBarChart(javafx.scene.chart.StackedBarChart) URL(java.net.URL) CheckBoxListCell(javafx.scene.control.cell.CheckBoxListCell) FXCollections(javafx.collections.FXCollections) HashMap(java.util.HashMap) Factoid(retrospector.model.Factoid) XYChart(javafx.scene.chart.XYChart) VBox(javafx.scene.layout.VBox) ArrayList(java.util.ArrayList) Media(retrospector.model.Media) HashSet(java.util.HashSet) LineChart(javafx.scene.chart.LineChart) ResourceBundle(java.util.ResourceBundle) Map(java.util.Map) SimpleIntegerProperty(javafx.beans.property.SimpleIntegerProperty) NaturalOrderComparator(retrospector.util.NaturalOrderComparator) Circle(javafx.scene.shape.Circle) HBox(javafx.scene.layout.HBox) ObjectProperty(javafx.beans.property.ObjectProperty) Label(javafx.scene.control.Label) Review(retrospector.model.Review) Node(javafx.scene.Node) Set(java.util.Set) Rectangle(javafx.scene.shape.Rectangle) CategoryAxis(javafx.scene.chart.CategoryAxis) BarChart(javafx.scene.chart.BarChart) Collectors(java.util.stream.Collectors) ChoiceBox(javafx.scene.control.ChoiceBox) TAB(retrospector.fxml.CoreController.TAB) Platform(javafx.application.Platform) FXML(javafx.fxml.FXML) Text(javafx.scene.text.Text) PieChart(javafx.scene.chart.PieChart) Stroolean(retrospector.util.Stroolean) List(java.util.List) ChronoUnit(java.time.temporal.ChronoUnit) LocalDate(java.time.LocalDate) ObservableList(javafx.collections.ObservableList) NumberAxis(javafx.scene.chart.NumberAxis) DataManager(retrospector.model.DataManager) Shape(javafx.scene.shape.Shape) HashMap(java.util.HashMap) Media(retrospector.model.Media) ArrayList(java.util.ArrayList) Review(retrospector.model.Review) NaturalOrderComparator(retrospector.util.NaturalOrderComparator) XYChart(javafx.scene.chart.XYChart) Factoid(retrospector.model.Factoid) SimpleIntegerProperty(javafx.beans.property.SimpleIntegerProperty) HashSet(java.util.HashSet)

Example 9 with Review

use of retrospector.model.Review in project Retrospector by NonlinearFruit.

the class MediaTabController method initMediaTab.

private void initMediaTab() {
    // Rating Stuff
    mediaStars.setPartialRating(true);
    mediaStars.setDisable(true);
    mediaStars.setMax(DataManager.getMaxRating() / 2);
    mediaStars.setRating(DataManager.getDefaultRating() / 2);
    mediaRating.setText(CoreController.ratingFormat.format(DataManager.getDefaultRating()));
    mediaMaxRating.setText(CoreController.ratingFormat.format(DataManager.getMaxRating()));
    mediaCategory.setItems(FXCollections.observableArrayList(DataManager.getCategories()));
    mediaCategory.getSelectionModel().selectedItemProperty().addListener((observe, old, neo) -> {
    });
    // Media Stuff
    mediaTitle.textProperty().addListener((observe, old, neo) -> mediaSave.setDisable(false));
    mediaCreator.textProperty().addListener((observe, old, neo) -> mediaSave.setDisable(false));
    mediaSeason.textProperty().addListener((observe, old, neo) -> mediaSave.setDisable(false));
    mediaEpisode.textProperty().addListener((observe, old, neo) -> mediaSave.setDisable(false));
    mediaDescription.textProperty().addListener((observe, old, neo) -> mediaSave.setDisable(false));
    mediaCategory.getSelectionModel().selectedItemProperty().addListener((observe, old, neo) -> mediaSave.setDisable(false));
    mediaType.setItems(FXCollections.observableArrayList(Media.Type.values()));
    mediaType.getSelectionModel().selectedItemProperty().addListener((observe, old, neo) -> {
        switch(neo) {
            case SERIES:
                mediaSeasonBox.setVisible(true);
                mediaEpisodeBox.setVisible(true);
                mediaEpisodeBox.toFront();
                break;
            case MINISERIES:
                mediaSeasonBox.setVisible(false);
                mediaEpisodeBox.setVisible(true);
                mediaSeasonBox.toFront();
                break;
            case SINGLE:
            default:
                mediaSeasonBox.setVisible(false);
                mediaEpisodeBox.setVisible(false);
        }
    });
    // Buttons
    mediaSave.setOnAction(e -> {
        Media m = new Media();
        m.clone(getMedia());
        System.out.println("Media ID: " + m.getId());
        m.setTitle(mediaTitle.getText());
        m.setCreator(mediaCreator.getText());
        m.setSeasonId(mediaSeason.getText());
        m.setEpisodeId(mediaEpisode.getText());
        m.setCategory(mediaCategory.getValue());
        m.setType(mediaType.getValue());
        m.setDescription(mediaDescription.getText());
        DataManager.updateDB(m);
        setMedia(m);
        mediaSave.setDisable(true);
    });
    mediaDelete.setOnAction(e -> {
        if (new Alert(Alert.AlertType.WARNING, "Are you sure you want to delete this?", ButtonType.NO, ButtonType.YES).showAndWait().get().equals(ButtonType.YES)) {
            DataManager.deleteDB(getMedia());
            setTab(TAB.SEARCH);
        }
    });
    mediaCancel.setOnAction(e -> {
        setTab(TAB.SEARCH);
    });
    mediaNewMedia.setOnAction(e -> {
        Media media = new Media();
        media.setId(DataManager.createDB(media));
        if (media.getId() < 2)
            System.err.println("Media got a <2 id (mediaNewMedia#setOnAction");
        setMedia(media);
        updateMediaTab();
        mediaTitle.requestFocus();
    });
    mediaAddSeason.setOnAction(e -> {
        Media media = new Media(getMedia().getTitle(), getMedia().getCreator(), getMedia().getCategory(), getMedia().getType());
        media.setDescription(getMedia().getDescription());
        int id = DataManager.createDB(media);
        for (Factoid factoid : getMedia().getFactoids()) {
            Factoid fact = new Factoid(factoid.getTitle(), factoid.getContent());
            fact.setMediaId(id);
            DataManager.createDB(fact);
        }
        setMedia(DataManager.getMedia(id));
        if (getMedia().getId() == -1)
            System.err.println("Media got a -1 id (mediaAddSeason#setOnAction");
        updateMediaTab();
        mediaSeason.requestFocus();
    });
    mediaAddEpisode.setOnAction(e -> {
        Media media = new Media(getMedia().getTitle(), getMedia().getCreator(), getMedia().getCategory(), getMedia().getType());
        media.setDescription(getMedia().getDescription());
        media.setSeasonId(getMedia().getSeasonId());
        int id = DataManager.createDB(media);
        for (Factoid factoid : getMedia().getFactoids()) {
            Factoid fact = new Factoid(factoid.getTitle(), factoid.getContent());
            fact.setMediaId(id);
            DataManager.createDB(fact);
        }
        setMedia(DataManager.getMedia(id));
        if (getMedia().getId() == -1)
            System.err.println("Media got a -1 id (mediaAddEpisode#setOnAction");
        updateMediaTab();
        mediaEpisode.requestFocus();
    });
    nextBtn.setOnAction(e -> {
        nextPreviousFunct.accept(1);
        update();
    });
    prevBtn.setOnAction(e -> {
        nextPreviousFunct.accept(-1);
        update();
    });
    // Factoid Stuff
    mediaTitleFactoid.setItems(FXCollections.observableArrayList(DataManager.getFactiodTypes()));
    mediaTitleFactoid.setDisable(true);
    mediaContentFactoid.setDisable(true);
    mediaSaveFactoid.setDisable(true);
    mediaEditFactoid.setDisable(true);
    mediaDeleteFactoid.setDisable(true);
    currentFactoid = new SimpleObjectProperty<>();
    currentFactoid.addListener((observe, old, neo) -> {
        boolean tf = false;
        if (neo == null)
            tf = true;
        mediaTitleFactoid.setDisable(tf);
        mediaContentFactoid.setDisable(tf);
        mediaSaveFactoid.setDisable(tf);
        mediaEditFactoid.setDisable(tf);
        mediaDeleteFactoid.setDisable(tf);
    });
    mediaFactoidTable.getSelectionModel().selectedItemProperty().addListener((observe, old, neo) -> {
        boolean tf = false;
        if (neo == null)
            tf = true;
        mediaEditFactoid.setDisable(tf);
        mediaDeleteFactoid.setDisable(tf);
    });
    mediaFactoidTable.setRowFactory(tv -> {
        TableRow<Factoid> row = new TableRow<>();
        row.setOnMouseClicked(event -> {
            if (event.getClickCount() == 2 && (!row.isEmpty())) {
                setFactoid(row.getItem());
            }
        });
        return row;
    });
    mediaTitleColumn.setCellValueFactory(new PropertyValueFactory<>("Title"));
    mediaContentColumn.setCellValueFactory(new PropertyValueFactory<>("Content"));
    mediaNewFactoid.setOnAction(e -> {
        Factoid factoid = new Factoid();
        factoid.setMediaId(getMedia().getId());
        factoid.setId(DataManager.createDB(factoid));
        mediaFactoidTable.getItems().add(factoid);
        setFactoid(factoid);
    });
    mediaEditFactoid.setOnAction(e -> {
        setFactoid(mediaFactoidTable.getSelectionModel().getSelectedItem());
    });
    mediaDeleteFactoid.setOnAction(e -> {
        if (new Alert(Alert.AlertType.WARNING, "Are you sure you want to delete this?", ButtonType.NO, ButtonType.YES).showAndWait().get().equals(ButtonType.YES)) {
            DataManager.deleteDB(mediaFactoidTable.getSelectionModel().getSelectedItem());
            updateMediaTab();
        }
    });
    mediaSaveFactoid.setOnAction(e -> {
        Factoid factoid = getFactoid();
        if (factoid.getId() > 0)
            DataManager.updateDB(factoid);
        else
            DataManager.createDB(factoid);
        updateMediaTab();
    });
    // Review Stuff
    mediaReviewTable.getSelectionModel().selectedItemProperty().addListener((observe, old, neo) -> {
        setReview(neo);
    });
    mediaReviewTable.setRowFactory(tv -> {
        TableRow<Review> row = new TableRow<>();
        row.setOnMouseClicked(event -> {
            if (event.getClickCount() == 2 && (!row.isEmpty())) {
                setTab(TAB.REVIEW);
            }
        });
        return row;
    });
    mediaRatingColumn.setCellValueFactory(new PropertyValueFactory<>("Rating"));
    mediaUserColumn.setCellValueFactory(new PropertyValueFactory<>("User"));
    mediaDateColumn.setCellValueFactory(new PropertyValueFactory<>("Date"));
    mediaNewReview.setOnAction(e -> {
        Review review = new Review();
        review.setMediaId(getMedia().getId());
        review.setId(DataManager.createDB(review));
        setReview(review);
        setTab(TAB.REVIEW);
    });
    mediaEditReview.setOnAction(e -> {
        setTab(TAB.REVIEW);
    });
    mediaDeleteReview.setOnAction(e -> {
        if (new Alert(Alert.AlertType.WARNING, "Are you sure you want to delete this?", ButtonType.NO, ButtonType.YES).showAndWait().get().equals(ButtonType.YES)) {
            DataManager.deleteDB(getReview());
            updateMediaTab();
        }
    });
}
Also used : TableRow(javafx.scene.control.TableRow) Media(retrospector.model.Media) Alert(javafx.scene.control.Alert) Review(retrospector.model.Review) Factoid(retrospector.model.Factoid)

Example 10 with Review

use of retrospector.model.Review in project Retrospector by NonlinearFruit.

the class MediaSectionController method updateMedia.

private void updateMedia() {
    // Media Filtering
    Boolean title = checkTitle.isSelected();
    Boolean creator = checkCreator.isSelected();
    Boolean season = checkSeason.isSelected();
    Boolean episode = checkEpisode.isSelected();
    Boolean category = checkCategory.isSelected();
    // Filter Table
    mediaTableFilter.setPredicate(m -> ((checkTitle.isSelected() && currentMedia.getTitle().equals(((Media) m).getTitle())) || !checkTitle.isSelected()) && ((checkCreator.isSelected() && currentMedia.getCreator().equals(((Media) m).getCreator())) || !checkCreator.isSelected()) && ((checkSeason.isSelected() && currentMedia.getSeasonId().equals(((Media) m).getSeasonId())) || !checkSeason.isSelected()) && ((checkEpisode.isSelected() && currentMedia.getEpisodeId().equals(((Media) m).getEpisodeId())) || !checkEpisode.isSelected()) && ((checkCategory.isSelected() && currentMedia.getCategory().equals(((Media) m).getCategory())) || !checkCategory.isSelected()));
    // Data Mining - Vars
    XYChart.Series data = new XYChart.Series();
    InfoBlipAccumulator info = new InfoBlipAccumulator();
    // Data Mining - Calcs
    for (Media m : mediaTable.getItems()) {
        info.accumulate(m);
        for (Review r : m.getReviews()) {
            data.getData().add(new XYChart.Data(dateToDouble(r.getDate()), r.getRating().intValue()));
            info.accumulate(r);
        }
    }
    // Stats
    statsBox.getChildren().clear();
    statsBox.getChildren().add(info.getInfo());
    // Chart
    chartRatingOverTime.getData().clear();
    if (data.getData().size() < 1500)
        chartRatingOverTime.getData().add(data);
    chartRotX.setLowerBound(dateToDouble(info.getEarliest()) - 1.0 / 12);
    chartRotX.setUpperBound(dateToDouble(LocalDate.now()) + 1.0 / 12);
}
Also used : Media(retrospector.model.Media) XYChart(javafx.scene.chart.XYChart) Review(retrospector.model.Review)

Aggregations

Review (retrospector.model.Review)12 Media (retrospector.model.Media)10 HashMap (java.util.HashMap)6 XYChart (javafx.scene.chart.XYChart)6 LocalDate (java.time.LocalDate)5 List (java.util.List)5 URL (java.net.URL)4 ChronoUnit (java.time.temporal.ChronoUnit)4 Arrays (java.util.Arrays)4 ObservableList (javafx.collections.ObservableList)4 DataManager (retrospector.model.DataManager)4 ArrayList (java.util.ArrayList)3 Map (java.util.Map)3 ResourceBundle (java.util.ResourceBundle)3 Collectors (java.util.stream.Collectors)3 FXCollections (javafx.collections.FXCollections)3 FXML (javafx.fxml.FXML)3 Initializable (javafx.fxml.Initializable)3 CategoryAxis (javafx.scene.chart.CategoryAxis)3 NumberAxis (javafx.scene.chart.NumberAxis)3