Я работаю над программой JavaFX, которая может отображать различные продукты в виде BarChart.Моя структура кода использует класс начальной загрузки GroceryGrapher.java , контроллер GroceryGrapherController.java и файл .fxml GroceryGrapher.fxml .
Я относительно новичок в JavaFX и пробовал разные подходы к созданию и отображению моего BarChart
.По большей части я решил проблемы и могу загрузить диаграмму с ее данными и компонентами, но моя проблема в том, что диаграмма не будет отображаться / обновляться после запуска программы.BarChart
является частью AnchorPane
(все это входит в StackPane
) в моем файле FXML, и я попытался обновить его после инициализации, поскольку он начинается пустым, но остается пустым.
BarChart
является частью AnchorPane
, который также имеет MenuBar
.Моя цель состояла в том, чтобы иметь возможность обновлять различные части BarChart
через MenuBar
.Когда я загружаю программу, загружаются MenuBar
и пустые BarChart
:
Вот как я инициализирую свой BarChart
и егоданные:
public class GroceryGrapherController implements Initializable {
@FXML
private AnchorPane anchorPane = new AnchorPane();
@FXML
private NumberAxis xAxis = new NumberAxis();
@FXML
private CategoryAxis yAxis = new CategoryAxis();
@FXML
private BarChart<Number, String> groceryBarChart;
@FXML
//private Stage stage;
Parent root;
@Override
public void initialize(URL location, ResourceBundle resources) {
groceryBarChart = new BarChart<Number, String>(xAxis, yAxis);
groceryBarChart.setTitle("Horizontal Grocery List");
xAxis.setLabel("Number");
xAxis.setTickLabelRotation(90);
yAxis.setLabel("Grocery Type");
// Populate BarChart
XYChart.Series<Number, String> series1 = new XYChart.Series<>();
series1.setName("Chocolates");
series1.getData().add(new XYChart.Data<Number, String>(25601.34, "Reese"));
series1.getData().add(new XYChart.Data<Number, String>(20148.82, "Cadbury"));
series1.getData().add(new XYChart.Data<Number, String>(10000, "Mars"));
series1.getData().add(new XYChart.Data<Number, String>(35407.15, "Snickers"));
series1.getData().add(new XYChart.Data<Number, String>(12000, "Lindt"));
XYChart.Series<Number, String> series2 = new XYChart.Series<>();
series2.setName("Vegetables");
series2.getData().add(new XYChart.Data<Number, String>(57401.85, "Cabbage"));
series2.getData().add(new XYChart.Data<Number, String>(41941.19, "Lettuce"));
series2.getData().add(new XYChart.Data<Number, String>(45263.37, "Tomato"));
series2.getData().add(new XYChart.Data<Number, String>(117320.16, "Eggplant"));
series2.getData().add(new XYChart.Data<Number, String>(14845.27, "Beetroot"));
XYChart.Series<Number, String> series3 = new XYChart.Series<>();
series3.setName("Drinks");
series3.getData().add(new XYChart.Data<Number, String>(45000.65, "Water"));
series3.getData().add(new XYChart.Data<Number, String>(44835.76, "Coke"));
series3.getData().add(new XYChart.Data<Number, String>(18722.18, "Sprite"));
series3.getData().add(new XYChart.Data<Number, String>(17557.31, "Mountain Dew"));
series3.getData().add(new XYChart.Data<Number, String>(92633.68, "Beer"));
// Need to do this because of a bug with CategoryAxis... manually set categories
yAxis.setCategories(FXCollections.observableArrayList("Reese", "Cadbury", "Mars", "Snickers", "Lindt", "Cabbage", "Lettuce",
"Tomato", "Eggplant", "Beetroot", "Water", "Coke", "Sprite", "Mountain Dew", "Beer"));
groceryBarChart.getData().addAll(series1, series2, series3);
}
Теперь у меня есть предмет:
В моем MenuBar
для загрузки BarChart
(поскольку он изначально выглядит пустым), который использует метод, который я создал, loadGraph
.Я пробовал разные методы, чтобы мой обновленный BarChart
появлялся без особого успеха.Моя первоначальная идея заключалась в том, чтобы использовать setScene
в методе loadGraph
, чтобы установить сцену на BarChart
, как показано в в этом примере .
Stage stage = (Stage) anchorPane.getScene().getWindow();
stage.setScene(new Scene(groceryBarChart, 800, 600));
Хотя это сработалоестественно, он заменил сцену, состоящую исключительно из BarChart
, удалив мой MenuBar
и предыдущий графический интерфейс:
Я видел этот вопрос , у которого была похожая проблема (я думаю), но я не был уверен, как применить его к моей программе.Я получил этот код:
try {
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("GroceryGrapher.fxml"));
root = (Parent) fxmlLoader.load();
GroceryGrapherController ggController = fxmlLoader.getController();
} catch (Exception e) {
e.printStackTrace();
}
Я скопировал инициализацию из метода initialize
в новый метод и попытался вызвать его с помощью ggController
, но это ничего не изменило.Я также попытался создать новый метод, updateData
:
@FXML
private void updateData() {
Platform.runLater(() -> {
groceryBarChart.setTitle("Horizontal Grocery List");
});
}
Я попытался вызвать его с помощью ggController
в методе loadGraph
, но мой BarChart
все еще не изменился.
Я знаю, что делаю что-то не так, но я не очень хорошо знаком с классом BarChart
и JavaFX, поэтому решил, что приду сюда, чтобы попросить о помощи.Мне нужно обновить существующий BarChart
в моем графическом интерфейсе, чтобы мои данные могли загружаться без замены всей сцены, чтобы MenuBar
оставался видимым в сцене, способной выполнять функции.Как бы я изменил BarChart
компонентную часть моего AnchorPane
, обновив данные по мере необходимости, без полной замены сцены, как я делал ранее?
Большое спасибо и извините, если этот вопросплохо или мои методы кодирования неверны.Буду признателен за все отзывы!
РЕДАКТИРОВАТЬ На всякий случай это может помочь, вот мой код FXML для BarChart.
<BarChart fx:id="groceryBarChart" layoutY="31.0" prefHeight="566.0" prefWidth="802.0">
<xAxis>
<CategoryAxis fx:id="yAxis" side="BOTTOM" />
</xAxis>
<yAxis>
<NumberAxis side="LEFT" fx:id="xAxis" />
</yAxis>
</BarChart>