Статические метки на графике в ScrollPane JavaFX - PullRequest
0 голосов
/ 25 сентября 2018

Я пытаюсь нарисовать несколько графиков рядом друг с другом, где ось графиков может находиться вне области просмотра.Я рисую каждый график внутри HBox, который вложен в ScrollPane.Это хорошо для простого рисования оси Y графиков, однако я хочу, чтобы метки оси X фиксировались на экране, чтобы при некоторых прокрутках по вертикали метки всегда были видны.

Я пробовалсоздание StackPane, где я вложил ScrollPane и HBox, упомянутые выше, и второй HBox для создания своего рода статического слоя.Это, к сожалению, нарушило возможности прокрутки на ScrollPane.

Есть ли способ удержать надписи на оси Y фиксированными при прокрутке в направлении X?

В настоящее время FXML:

<VBox>
    <ScrollPane>
        <HBox>

        </HBox>
    </ScrollPane>
</VBox>

Что я пробовал:

<VBox>
    <StackPane>
        <ScrollPane>
            <HBox>

            </HBox>
        </ScrollPane>
        <HBox>

        </HBox>
    <StackPane>
</VBox>

1 Ответ

0 голосов
/ 25 сентября 2018

Один из способов, который я могу придумать, это иметь дело с ScrollBar (s) вместо ScrollPane.Вы можете установить минимальное / максимальное значение полосы прокрутки с нижними / верхними границами оси.А при изменении значения прокрутки обновите границы оси соответственно.Нечто подобное ..

final AreaChart chart = new AreaChart(xAxis, yAxis);
        ScrollBar scroll = new ScrollBar();
        scroll.setMin(chartLowerBound);
        scroll.setMax(chartUpperBound);
        scroll.setVisibleAmount(10 * tickUnit);
        scroll.valueProperty().addListener((obs, old, nxtLb) -> {
            double nxtUb = nxtLb.doubleValue() + (10 * tickUnit);
            xAxis.setUpperBound(nxtUb);
            xAxis.setLowerBound(nxtLb.doubleValue());
        });

Ниже приведен пример быстрой работы.Постарайтесь понять базовую логику и реализовать ее в соответствии с вашими потребностями.

import java.util.Random;
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.chart.AreaChart;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart.Data;
import javafx.scene.chart.XYChart.Series;
import javafx.scene.control.ScrollBar;
import javafx.scene.layout.Priority;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class ScrollableChartDemo extends Application {

    public static void main(String... args) {
        launch(args);
    }

    @Override
    public void start(Stage stage) throws Exception {
        stage.setTitle("Scrollable Chart");
        Random random = new Random(12);

        double tickUnit = .04;
        double chartLowerBound = 0;
        double chartUpperBound = 4;

        final ObservableList<Data> seriesData = FXCollections.observableArrayList();
        Series series = new Series("Series 1", seriesData);

        final ObservableList<Data> series2Data = FXCollections.observableArrayList();
        Series series2 = new Series("Series 2", series2Data);

        double tempoXAxis = 0.0;
        for (int i = 0; i < 100; i++) {
            seriesData.add(new Data(tempoXAxis, random.nextInt(12)));
            series2Data.add(new Data(tempoXAxis, random.nextInt(12)));
            tempoXAxis += tickUnit;
        }

        final ObservableList<Series> allSeriesData = FXCollections.observableArrayList(series, series2);

        NumberAxis xAxis = new NumberAxis("Time", 0, (10 * tickUnit), tickUnit);
        NumberAxis yAxis = new NumberAxis();

        final AreaChart chart = new AreaChart(xAxis, yAxis);
        chart.getData().addAll(allSeriesData);
        VBox.setVgrow(chart, Priority.ALWAYS);
        ScrollBar scroll = new ScrollBar();
        scroll.setMin(chartLowerBound);
        scroll.setMax(chartUpperBound - (10 * tickUnit));
        scroll.setVisibleAmount(10 * tickUnit);
        scroll.valueProperty().addListener((obs, old, nxtLb) -> {
            double nxtUb = nxtLb.doubleValue() + (10 * tickUnit);
            xAxis.setUpperBound(nxtUb);
            xAxis.setLowerBound(nxtLb.doubleValue());
        });

        chart.setOnScroll((ev) -> {
            double nxtUb;
            double nxtLb;
            if (ev.getDeltaY() > 0) {
                nxtUb = xAxis.getUpperBound() + tickUnit;
                if (nxtUb > chartUpperBound) {
                    nxtUb = chartUpperBound;
                }
                nxtLb = nxtUb - (10 * tickUnit);
            } else {
                nxtLb = xAxis.getLowerBound() - tickUnit;
                if (nxtLb < chartLowerBound) {
                    nxtLb = chartLowerBound;
                }
                nxtUb = nxtLb + (10 * tickUnit);
            }
            xAxis.setUpperBound(nxtUb);
            xAxis.setLowerBound(nxtLb);
            scroll.setValue(nxtLb);
            ev.consume();
        });


        VBox vb = new VBox();
        vb.setSpacing(5);
        vb.getChildren().addAll(chart, scroll);
        Scene scene = new Scene(vb);
        stage.setScene(scene);
        stage.setWidth(1000);
        stage.setHeight(700);
        stage.show();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...