динамическое изменение xAxis в LineChart JavaFX

Я пытаюсь реализовать lineChart в JavaFX. Он должен:

  1. Изначально иметь линейную ось X (xAxis),
  2. При нажатии на кнопку менять ось на логарифмическую ось X

Проблема в том, что LineChart не имеет метода setAxis. Другая проблема в том, что моя архитектура спроектирована таким образом, что я не могу просто перерисовать LineChart.

Я попробовала просто пересчитать значения оси X. Но в этом случае отметки (ticks) располагаются неправильно, и диаграмма схлопывается по горизонтали.

Затем я реализовала свой собственный класс LogarithmicAxis, который наследуется от ValueAxis. Он работает правильно, и если я создам lineChart таким образом:

NumberAxis yAxis = new NumberAxis();
LogarithmicAxis xAxis = new LogarithmicAxis();
LineChart<Number, Number> lineChart = new LineChart<>(xAxis, yAxis);

Я получаю то, что мне нужно. Но я не могу динамически менять ось

Мой код представления состоит из методов типа

public Region build() {

GridPane gridPane = new GridPane();

ColumnConstraints col1 = new ColumnConstraints();
gridPane.getColumnConstraints().addAll(col1);
gridPane.add(createSettingsBox(), 0, 0, 0, 0);

return gridPane;
}

private Node createSettingsBox() {
    VBox settingsBox = new VBox(10);


    settingsBox.getChildren().add(createButton());

    return settingsBox;
}

Но как мне добраться до диаграммы и перерисовать ее, если у нее высокий уровень вложенности? Я не хочу выносить lineChart в поле представления.


Ответы (1 шт):

Автор решения: Dmitry

Первое, что приходит в голову - заменить весь LineChart. Находите родителя (желательно чтобы это был AnchorPane) линейного LineChart, очищаете его и вставляете логарифмический LineChart.

LineChart<Number, Number> logaLineChart = new LineChart<>(new LogarithmicAxis(), new NumberAxis());
AnchorPane parent = (AnchorPane) lineLineChart.getParent();
parent.getChildren().clear();
parent.getChildren().add(logaLineChart);

Если привязать родителя в окне, то будет вставляться в тоже место.

→ Ссылка