'Gantt chart: freeze legend and axes when scrolling

In the chart factory and I use there SlidingGanttCategoryDataset. But the scrolling does not appear. What am I missing?

public JFreeChartGanttChart(String applicationTitle, String chartTitle) {
    super(applicationTitle);

    // based on the dataset we create the chart
    Map<Integer, Map<Integer, String>> labels = new LinkedHashMap<>();
    JFreeChart chart = ChartFactory.createGanttChart(chartTitle,
                                                     "Vessels",
                                                     "Time",
                                                     createDataset(labels),
                                                     true,
                                                     true,
                                                     true);

    // Adding chart into a chart pane
    CategoryPlot plot = (CategoryPlot) chart.getPlot();
    plot.getDomainAxis().setUpperMargin(0.001);
    plot.getRangeAxis().setLowerMargin(0.01);
    plot.getRangeAxis().setUpperMargin(0.01);
    plot.getDomainAxis().setLowerMargin(0.001);

    ChartPanel chartPanel = new ChartPanel(chart);
    chartPanel.setPreferredSize(new Dimension(1000, 1500));
    setContentPane(chartPanel);

    CategoryItemRenderer renderer = plot.getRenderer();
    renderer.setDefaultItemLabelGenerator(new IntervalCategoryItemLabelGenerator(){
        @Override
        public String generateRowLabel(CategoryDataset dataset, int row) {
            return "Text ... " + row ; //  not needed here
        }

        @Override
        public String generateColumnLabel(CategoryDataset dataset, int column) {
            return " Text ... " + column; //  not needed here
        }

        @Override
        public String generateLabel(CategoryDataset dataset, int row, int column) {
            return labels.get(row).get(column) ;  // row+ " " + column
        }
    });

    renderer.setDefaultItemLabelsVisible(true);
    renderer.setDefaultItemLabelPaint(Color.BLACK);

    renderer.setDefaultItemLabelFont(new Font("arial", Font.PLAIN, 6), false);

    // setDefaultPositiveItemLabelPosition - text will be inside label
    renderer.setDefaultNegativeItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.INSIDE6,
                                                                       TextAnchor.BOTTOM_LEFT));
    }
}


Solution 1:[1]

While it is technically possible to add a ChartPanel to a JScrollPane, rendering and scrolling hundreds or thousands of tasks scales poorly; the typical appearance is shown here. Instead, use a SlidingGanttCategoryDataset, which "presents a subset of the categories in an underlying dataset." Given an arbitrary number, N, of tasks to to be displayed MAX at a time, construct the corresponding dataset:

private static final int N = 1000;
private static final int MAX = 12;
…
private final SlidingGanttCategoryDataset dataset = new
    SlidingGanttCategoryDataset(taskSeriesCollection, 0, MAX);

Then add a suitable control adjacent to the ChartPanel and listen for changes; update the dataset's first displayed index accordingly:

JSlider slider = new JSlider(JSlider.VERTICAL, 0, N - MAX, 0);
slider.addChangeListener((ChangeEvent e) -> {
    dataset.setFirstCategoryIndex(slider.getValue());
});

image

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1