JFreeChart und scrollen

flashdog

Bekanntes Mitglied
Hallo,
in den folgenden JFreeChart Beispiel ist es möglich das Diagramm zu vergrößern. Ist es auch möglich in den vergrößerten Diagramm Scroll-Balken einzufügen?

Java:
import java.awt.Dimension;
import javax.swing.JPanel;
import org.jfree.chart.*;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.xy.*;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RefineryUtilities;

public class LineChartDemo2 extends ApplicationFrame
{
    public LineChartDemo2(String s)
    {
        super(s);
        JPanel jpanel = createDemoPanel();
        jpanel.setPreferredSize(new Dimension(500, 270));
        setContentPane(jpanel);
    }

    private static XYDataset createDataset()
    {
        XYSeries xyseries = new XYSeries("First");
        xyseries.add(1.0D, 1.0D);
        xyseries.add(2D, 4D);
        xyseries.add(3D, 3D);
        xyseries.add(4D, 5D);
        xyseries.add(5D, 5D);
        xyseries.add(6D, 7D);
        xyseries.add(7D, 7D);
        xyseries.add(8D, 8D);
        XYSeries xyseries1 = new XYSeries("Second");
        xyseries1.add(1.0D, 5D);
        xyseries1.add(2D, 7D);
        xyseries1.add(3D, 6D);
        xyseries1.add(4D, 8D);
        xyseries1.add(5D, 4D);
        xyseries1.add(6D, 4D);
        xyseries1.add(7D, 2D);
        xyseries1.add(8D, 1.0D);
        XYSeries xyseries2 = new XYSeries("Third");
        xyseries2.add(3D, 4D);
        xyseries2.add(4D, 3D);
        xyseries2.add(5D, 2D);
        xyseries2.add(6D, 3D);
        xyseries2.add(7D, 6D);
        xyseries2.add(8D, 3D);
        xyseries2.add(9D, 4D);
        xyseries2.add(10D, 3D);
        XYSeriesCollection xyseriescollection = new XYSeriesCollection();
        xyseriescollection.addSeries(xyseries);
        xyseriescollection.addSeries(xyseries1);
        xyseriescollection.addSeries(xyseries2);
        return xyseriescollection;
    }

    private static JFreeChart createChart(XYDataset xydataset)
    {
        JFreeChart jfreechart = ChartFactory.createXYLineChart("Line Chart Demo 2", "X", "Y", xydataset, PlotOrientation.VERTICAL, true, true, false);
        XYPlot xyplot = (XYPlot)jfreechart.getPlot();
        xyplot.setDomainPannable(true);
        xyplot.setRangePannable(true);
        XYLineAndShapeRenderer xylineandshaperenderer = (XYLineAndShapeRenderer)xyplot.getRenderer();
        xylineandshaperenderer.setBaseShapesVisible(true);
        xylineandshaperenderer.setBaseShapesFilled(true);
        NumberAxis numberaxis = (NumberAxis)xyplot.getRangeAxis();
        numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
        return jfreechart;
    }

    public static JPanel createDemoPanel()
    {
        JFreeChart jfreechart = createChart(createDataset());
        ChartPanel chartpanel = new ChartPanel(jfreechart);
        chartpanel.setMouseWheelEnabled(true);
        return chartpanel;
    }

    public static void main(String args[])
    {
        LineChartDemo2 linechartdemo2 = new LineChartDemo2("JFreeChart: LineChartDemo2.java");
        linechartdemo2.pack();
        RefineryUtilities.centerFrameOnScreen(linechartdemo2);
        linechartdemo2.setVisible(true);
    }
}

Vielen Dank im Voraus.
 

flashdog

Bekanntes Mitglied
Ich habe folgendes JFreeChart Diagramm mit scrolling gefunden:
Java:
import java.awt.*;
import java.util.Date;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import org.jfree.chart.*;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.DateAxis;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.IntervalMarker;
import org.jfree.chart.renderer.category.GanttRenderer;
import org.jfree.data.gantt.*;
import org.jfree.data.general.DatasetUtilities;
import org.jfree.data.time.*;
import org.jfree.ui.*;

public class SlidingGanttDatasetDemo1 extends ApplicationFrame
{
    static class DemoPanel extends JPanel
        implements ChangeListener
    {

        public static GanttCategoryDataset createDataset()
        {
            TaskSeries taskseries = new TaskSeries("Scheduled");
            Day day = new Day();
            Day day1 = new Day();
            for(int i = 0; i < 50; i++)
            {
                int j = (int)(Math.random() * 10D) + 1;
                for(int k = 0; k < j; k++)
                    day1 = (Day)day1.next();

                taskseries.add(new Task("Task " + i, new Date(day.getMiddleMillisecond()), new Date(day1.getMiddleMillisecond())));
                day = (Day)day1.next();
                day1 = (Day)day1.next();
            }

            TaskSeriesCollection taskseriescollection = new TaskSeriesCollection();
            taskseriescollection.add(taskseries);
            return taskseriescollection;
        }

        private static JFreeChart createChart(SlidingGanttCategoryDataset slidingganttcategorydataset)
        {
            JFreeChart jfreechart = ChartFactory.createGanttChart("Gantt Chart Demo", "Task", "Date", slidingganttcategorydataset, true, true, false);
            CategoryPlot categoryplot = (CategoryPlot)jfreechart.getPlot();
            Hour hour = new Hour(1, 14, 5, 2008);
            for(int i = 0; i < 12; i++)
            {
                IntervalMarker intervalmarker = new IntervalMarker(hour.getFirstMillisecond(), hour.getLastMillisecond(), Color.lightGray);
                categoryplot.addRangeMarker(intervalmarker, Layer.BACKGROUND);
                hour = (Hour)hour.next().next();
            }

            categoryplot.getDomainAxis().setMaximumCategoryLabelWidthRatio(10F);
            DateAxis dateaxis = (DateAxis)categoryplot.getRangeAxis();
            dateaxis.setRange(DatasetUtilities.findRangeBounds(slidingganttcategorydataset.getUnderlyingDataset(), true));
            GanttRenderer ganttrenderer = (GanttRenderer)categoryplot.getRenderer();
            ganttrenderer.setDrawBarOutline(false);
            ganttrenderer.setShadowVisible(false);
            return jfreechart;
        }

        public void stateChanged(ChangeEvent changeevent)
        {
            dataset.setFirstCategoryIndex(scroller.getValue());
        }

        JScrollBar scroller;
        SlidingGanttCategoryDataset dataset;

        public DemoPanel()
        {
            super(new BorderLayout());
            dataset = new SlidingGanttCategoryDataset(createDataset(), 0, 15);
            JFreeChart jfreechart = createChart(dataset);
            ChartPanel chartpanel = new ChartPanel(jfreechart);
            chartpanel.setPreferredSize(new Dimension(400, 400));
            scroller = new JScrollBar(1, 0, 15, 0, 50);
            add(chartpanel);
            scroller.getModel().addChangeListener(this);
            JPanel jpanel = new JPanel(new BorderLayout());
            jpanel.add(scroller);
            jpanel.setBorder(BorderFactory.createEmptyBorder(66, 2, 2, 2));
            add(jpanel, "East");
        }
    }


    public SlidingGanttDatasetDemo1(String s)
    {
        super(s);
        setDefaultCloseOperation(3);
        setContentPane(createDemoPanel());
    }

    public static JPanel createDemoPanel()
    {
        return new DemoPanel();
    }

    public static void main(String args[])
    {
        SlidingGanttDatasetDemo1 slidingganttdatasetdemo1 = new SlidingGanttDatasetDemo1("JFreeChart: SlidingGanttDatasetDemo1.java");
        slidingganttdatasetdemo1.pack();
        RefineryUtilities.centerFrameOnScreen(slidingganttdatasetdemo1);
        slidingganttdatasetdemo1.setVisible(true);
    }
}

Das obere Beispiel habe ich versucht mit den Code im ersten Post zu mixen um die Scrolling Funktionalität zu bekommen, aber leider weiss ich nicht wie man SlidingGanttCategoryDataset ersetzen kann. Hier ist mein versuch den Code zu erweitern:
Java:
import java.awt.BorderLayout;
import java.awt.Dimension;

import javax.swing.BorderFactory;
import javax.swing.JPanel;
import javax.swing.JScrollBar;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

import org.jfree.chart.*;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.category.SlidingCategoryDataset;
import org.jfree.data.xy.*;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RefineryUtilities;

public class LineChartDemo2 extends ApplicationFrame {

  static class DemoPanel extends JPanel implements ChangeListener {

    private static XYDataset createDataset() {
      XYSeries xyseries = new XYSeries("First");
      xyseries.add(1.0D, 1.0D);
      xyseries.add(2D, 4D);
      xyseries.add(3D, 3D);
      xyseries.add(4D, 5D);
      xyseries.add(5D, 5D);
      xyseries.add(6D, 7D);
      xyseries.add(7D, 7D);
      xyseries.add(8D, 8D);
      xyseries.add(9D, 8D);
      xyseries.add(10D, 8D);
      xyseries.add(11D, 8D);
      xyseries.add(12D, 8D);
      xyseries.add(13D, 8D);
      xyseries.add(14D, 8D);
      xyseries.add(15D, 8D);
      xyseries.add(16D, 25D);
      xyseries.add(17D, 8D);
      xyseries.add(18D, 5D);
      xyseries.add(19D, 7D);
      xyseries.add(20D, 6D);
      xyseries.add(21D, 8D);
      xyseries.add(22D, 4D);
      xyseries.add(23D, 4D);
      xyseries.add(24D, 2D);
      xyseries.add(25D, 1.0D);

      XYSeriesCollection xyseriescollection = new XYSeriesCollection();
      xyseriescollection.addSeries(xyseries);

      return xyseriescollection;
    }

    private static JFreeChart createChart(XYDataset xydataset) {
      JFreeChart jfreechart = ChartFactory.createXYLineChart(
          "Line Chart Demo 2", "X", "Y", xydataset, PlotOrientation.VERTICAL,
          true, true, false);
      XYPlot xyplot = (XYPlot) jfreechart.getPlot();
      xyplot.setDomainPannable(true);
      xyplot.setRangePannable(true);
      XYLineAndShapeRenderer xylineandshaperenderer = (XYLineAndShapeRenderer) xyplot
          .getRenderer();
      xylineandshaperenderer.setBaseShapesVisible(true);
      xylineandshaperenderer.setBaseShapesFilled(true);
      NumberAxis numberaxis = (NumberAxis) xyplot.getRangeAxis();
      numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
      return jfreechart;
    }

    public void stateChanged(ChangeEvent changeevent) {
      dataset.setFirstCategoryIndex(scroller.getValue());
    }

    JScrollBar scroller;
    SlidingCategoryDataset dataset;
    public DemoPanel()
    {
        super(new BorderLayout());
        dataset = new SlidingGanttCategoryDataset(createDataset(), 0, 15);
        JFreeChart jfreechart = createChart(dataset);
        ChartPanel chartpanel = new ChartPanel(jfreechart);
        chartpanel.setPreferredSize(new Dimension(400, 400));
        scroller = new JScrollBar(1, 0, 15, 0, 50);
        add(chartpanel);
        scroller.getModel().addChangeListener(this);
        JPanel jpanel = new JPanel(new BorderLayout());
        jpanel.add(scroller);
        jpanel.setBorder(BorderFactory.createEmptyBorder(66, 2, 2, 2));
        add(jpanel, "East");
    }
  }

  public LineChartDemo2(String s) {
    super(s);
    // JPanel jpanel = createDemoPanel();
    // jpanel.setPreferredSize(new Dimension(500, 270));
    // setContentPane(jpanel);
    setDefaultCloseOperation(3);
    setContentPane(createDemoPanel());
  }  
  
  public static JPanel createDemoPanel() {
    // JFreeChart jfreechart = createChart(createDataset());
    // ChartPanel chartpanel = new ChartPanel(jfreechart);
    // chartpanel.setMouseWheelEnabled(true);
    // return chartpanel;
    return new DemoPanel();
  }
  
  public static void main(String args[]) {
    LineChartDemo2 linechartdemo2 = new LineChartDemo2(
        "JFreeChart: LineChartDemo2.java");
    linechartdemo2.pack();
    RefineryUtilities.centerFrameOnScreen(linechartdemo2);
    linechartdemo2.setVisible(true);
  }
}

Wie könnte ich Gantt Chart mit XYLineChart ersetzen um die scrolling funktionalität zu erhalten?
 
S

SlaterB

Gast
hmm, das ist ja alles kompliziert, SlidingGanttCategoryDataset habe ich gar nicht in meiner Version, das mag ich alles nicht genauer anschauen,

ich dachte eher was Richtung einfachem JScrollPane um das ChartPanel herum,
von
JFreeChart: Bar Chart Demo : Bar ChartChartJava
als Beispiel ausgehend

das pack() des JFrames weg, ansonsten beim Einfügen des ChartPanels in die GUI

Java:
chartPanel.setPreferredSize(new Dimension(800, 370)); // schön groß damit gescrollt werden muss
JScrollPane sp = new JScrollPane(chartPanel);
add(sp);
setSize(400, 200); // JFrame kleiner
 

flashdog

Bekanntes Mitglied
Leider bekomme ich diese Fehlermeldung:
Java:
Exception in thread "main" java.lang.IllegalArgumentException: adding container's parent to itself
	at java.awt.Container.checkAddToSelf(Container.java:420)
	at java.awt.Container.addImpl(Container.java:1038)
	at java.awt.Container.add(Container.java:365)
	at LineChartDemo2.createDemoPanel(LineChartDemo2.java:82)
	at LineChartDemo2.<init>(LineChartDemo2.java:19)
	at LineChartDemo2.main(LineChartDemo2.java:90)

mit den diesen Code:
Java:
import java.awt.Dimension;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

import org.jfree.chart.*;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.xy.*;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RefineryUtilities;
 
public class LineChartDemo2 extends ApplicationFrame
{
    public LineChartDemo2(String s)
    {
        super(s);
        JPanel jpanel = createDemoPanel();
        //jpanel.setPreferredSize(new Dimension(500, 270));
        setContentPane(jpanel);
    }
 
    private static XYDataset createDataset()
    {
        XYSeries xyseries = new XYSeries("First");
        xyseries.add(1.0D, 1.0D);
        xyseries.add(2D, 4D);
        xyseries.add(3D, 3D);
        xyseries.add(4D, 5D);
        xyseries.add(5D, 5D);
        xyseries.add(6D, 7D);
        xyseries.add(7D, 7D);
        xyseries.add(8D, 8D);
        xyseries.add(9D, 8D);
        xyseries.add(10D, 8D);
        xyseries.add(11D, 8D);
        xyseries.add(12D, 8D);
        xyseries.add(13D, 8D);
        xyseries.add(14D, 8D);
        xyseries.add(15D, 8D);
        xyseries.add(16D, 25D);
        xyseries.add(17D, 8D);
        xyseries.add(18D, 5D);
        xyseries.add(19D, 7D);
        xyseries.add(20D, 6D);
        xyseries.add(21D, 8D);
        xyseries.add(22D, 4D);
        xyseries.add(23D, 4D);
        xyseries.add(24D, 2D);
        xyseries.add(25D, 1.0D);
   
        XYSeriesCollection xyseriescollection = new XYSeriesCollection();
        xyseriescollection.addSeries(xyseries);
   
        return xyseriescollection;

    }
 
    private static JFreeChart createChart(XYDataset xydataset)
    {
        JFreeChart jfreechart = ChartFactory.createXYLineChart("Line Chart Demo 2", "X", "Y", xydataset, PlotOrientation.VERTICAL, true, true, false);
        XYPlot xyplot = (XYPlot)jfreechart.getPlot();
        xyplot.setDomainPannable(true);
        xyplot.setRangePannable(true);
        XYLineAndShapeRenderer xylineandshaperenderer = (XYLineAndShapeRenderer)xyplot.getRenderer();
        xylineandshaperenderer.setBaseShapesVisible(true);
        xylineandshaperenderer.setBaseShapesFilled(true);
        NumberAxis numberaxis = (NumberAxis)xyplot.getRangeAxis();
        numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
        return jfreechart;
    }
 
    public static JPanel createDemoPanel()
    {
        JFreeChart jfreechart = createChart(createDataset());
        ChartPanel chartPanel = new ChartPanel(jfreechart);
        chartPanel.setMouseWheelEnabled(true);
        
        chartPanel.setPreferredSize(new Dimension(800, 370)); // schoen gross damit gescrollt werden muss
        JScrollPane sp = new JScrollPane(chartPanel);
        chartPanel.add(sp);
        chartPanel.setSize(400, 200); // JFrame kleiner
        
        return chartPanel;
    }
 
    public static void main(String args[])
    {
        LineChartDemo2 linechartdemo2 = new LineChartDemo2("JFreeChart: LineChartDemo2.java");
        //linechartdemo2.pack();
        RefineryUtilities.centerFrameOnScreen(linechartdemo2);
        linechartdemo2.setVisible(true);
    }
}

Wie kann man dieses Problem korrigieren?
 
S

SlaterB

Gast
hmm, grundsätzliche Kenntnisse von Swing wären von Vorteil bei solchen Dingen ;)

Zeile 80 ist ok, das gehört ja zum ChartPanel, Zeile 81 bis 83 müssen da raus,
die müssen nach oben an Stelle von Zeile 20 + 21,
und Zeile 19 wandle um in
JPanel chartPanel = createDemoPanel();
 

flashdog

Bekanntes Mitglied
Nun bekomme ich wieder diese Fehlermeldung nur mit einer anderen Zeile:
Java:
Exception in thread "main" java.lang.IllegalArgumentException: adding container's parent to itself
	at java.awt.Container.checkAddToSelf(Container.java:420)
	at java.awt.Container.addImpl(Container.java:1038)
	at java.awt.Container.add(Container.java:365)
	at LineChartDemo2.<init>(LineChartDemo2.java:21)
	at LineChartDemo2.main(LineChartDemo2.java:91)

Mit den folgenden aktualliesierten Code:
Java:
import java.awt.Dimension;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

import org.jfree.chart.*;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.xy.*;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RefineryUtilities;
 
public class LineChartDemo2 extends ApplicationFrame
{
    public LineChartDemo2(String s)
    {
        super(s);
        JPanel chartPanel = createDemoPanel(); 
        JScrollPane sp = new JScrollPane(chartPanel);
        chartPanel.add(sp);
        chartPanel.setSize(400, 200); // JFrame kleiner
        //jpanel.setPreferredSize(new Dimension(500, 270));
        setContentPane(chartPanel);
    }
 
    private static XYDataset createDataset()
    {
        XYSeries xyseries = new XYSeries("First");
        xyseries.add(1.0D, 1.0D);
        xyseries.add(2D, 4D);
        xyseries.add(3D, 3D);
        xyseries.add(4D, 5D);
        xyseries.add(5D, 5D);
        xyseries.add(6D, 7D);
        xyseries.add(7D, 7D);
        xyseries.add(8D, 8D);
        xyseries.add(9D, 8D);
        xyseries.add(10D, 8D);
        xyseries.add(11D, 8D);
        xyseries.add(12D, 8D);
        xyseries.add(13D, 8D);
        xyseries.add(14D, 8D);
        xyseries.add(15D, 8D);
        xyseries.add(16D, 25D);
        xyseries.add(17D, 8D);
        xyseries.add(18D, 5D);
        xyseries.add(19D, 7D);
        xyseries.add(20D, 6D);
        xyseries.add(21D, 8D);
        xyseries.add(22D, 4D);
        xyseries.add(23D, 4D);
        xyseries.add(24D, 2D);
        xyseries.add(25D, 1.0D);
   
        XYSeriesCollection xyseriescollection = new XYSeriesCollection();
        xyseriescollection.addSeries(xyseries);
   
        return xyseriescollection;

    }
 
    private static JFreeChart createChart(XYDataset xydataset)
    {
        JFreeChart jfreechart = ChartFactory.createXYLineChart("Line Chart Demo 2", "X", "Y", xydataset, PlotOrientation.VERTICAL, true, true, false);
        XYPlot xyplot = (XYPlot)jfreechart.getPlot();
        xyplot.setDomainPannable(true);
        xyplot.setRangePannable(true);
        XYLineAndShapeRenderer xylineandshaperenderer = (XYLineAndShapeRenderer)xyplot.getRenderer();
        xylineandshaperenderer.setBaseShapesVisible(true);
        xylineandshaperenderer.setBaseShapesFilled(true);
        NumberAxis numberaxis = (NumberAxis)xyplot.getRangeAxis();
        numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
        return jfreechart;
    }
 
    public static JPanel createDemoPanel()
    {
        JFreeChart jfreechart = createChart(createDataset());
        ChartPanel chartPanel = new ChartPanel(jfreechart);
        chartPanel.setMouseWheelEnabled(true);
        
        chartPanel.setPreferredSize(new Dimension(800, 370)); // schoen gross damit gescrollt werden muss

        
        return chartPanel;
    }
 
    public static void main(String args[])
    {
        LineChartDemo2 linechartdemo2 = new LineChartDemo2("JFreeChart: LineChartDemo2.java");
        //linechartdemo2.pack();
        RefineryUtilities.centerFrameOnScreen(linechartdemo2);
        linechartdemo2.setVisible(true);
    }
}

Wie könnte man das Problem lösen?
 
S

SlaterB

Gast
chartPanel.add(sp);
hast du erfunden, dnan doch lieber meinen Originalcode
add(sp);
das setSize() war auch für das JFrame gedacht, da muss auch chartPanel. weg,

und setContentPane(chartPanel);
schließlich noch weg, das chartPanel steckt ja jetzt im ScrollPane
 

flashdog

Bekanntes Mitglied
Opss, danke es hat funktioniert, aber das Ergebnis habe ich mir ein wenig anders vorgestellt.

Ich wollte eigentlich nur entlang der X-Achse scrollen können, so dass die y-Achse immer noch zu sehen ist. Der folgende Code benutzt Gantt Chart und es möglich in Y-Achse zu scrollen so dass die X-Achse immer noch zu sehen ist.

Java:
import java.awt.*;
import java.util.Date;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import org.jfree.chart.*;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.DateAxis;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.IntervalMarker;
import org.jfree.chart.renderer.category.GanttRenderer;
import org.jfree.data.gantt.*;
import org.jfree.data.general.DatasetUtilities;
import org.jfree.data.time.*;
import org.jfree.ui.*;
 
public class SlidingGanttDatasetDemo1 extends ApplicationFrame
{
    static class DemoPanel extends JPanel
        implements ChangeListener
    {
 
        public static GanttCategoryDataset createDataset()
        {
            TaskSeries taskseries = new TaskSeries("Scheduled");
            Day day = new Day();
            Day day1 = new Day();
            for(int i = 0; i < 50; i++)
            {
                int j = (int)(Math.random() * 10D) + 1;
                for(int k = 0; k < j; k++)
                    day1 = (Day)day1.next();
 
                taskseries.add(new Task("Task " + i, new Date(day.getMiddleMillisecond()), new Date(day1.getMiddleMillisecond())));
                day = (Day)day1.next();
                day1 = (Day)day1.next();
            }
 
            TaskSeriesCollection taskseriescollection = new TaskSeriesCollection();
            taskseriescollection.add(taskseries);
            return taskseriescollection;
        }
 
        private static JFreeChart createChart(SlidingGanttCategoryDataset slidingganttcategorydataset)
        {
            JFreeChart jfreechart = ChartFactory.createGanttChart("Gantt Chart Demo", "Task", "Date", slidingganttcategorydataset, true, true, false);
            CategoryPlot categoryplot = (CategoryPlot)jfreechart.getPlot();
            Hour hour = new Hour(1, 14, 5, 2008);
            for(int i = 0; i < 12; i++)
            {
                IntervalMarker intervalmarker = new IntervalMarker(hour.getFirstMillisecond(), hour.getLastMillisecond(), Color.lightGray);
                categoryplot.addRangeMarker(intervalmarker, Layer.BACKGROUND);
                hour = (Hour)hour.next().next();
            }
 
            categoryplot.getDomainAxis().setMaximumCategoryLabelWidthRatio(10F);
            DateAxis dateaxis = (DateAxis)categoryplot.getRangeAxis();
            dateaxis.setRange(DatasetUtilities.findRangeBounds(slidingganttcategorydataset.getUnderlyingDataset(), true));
            GanttRenderer ganttrenderer = (GanttRenderer)categoryplot.getRenderer();
            ganttrenderer.setDrawBarOutline(false);
            ganttrenderer.setShadowVisible(false);
            return jfreechart;
        }
 
        public void stateChanged(ChangeEvent changeevent)
        {
            dataset.setFirstCategoryIndex(scroller.getValue());
        }
 
        JScrollBar scroller;
        SlidingGanttCategoryDataset dataset;
 
        public DemoPanel()
        {
            super(new BorderLayout());
            dataset = new SlidingGanttCategoryDataset(createDataset(), 0, 15);
            JFreeChart jfreechart = createChart(dataset);
            ChartPanel chartpanel = new ChartPanel(jfreechart);
            chartpanel.setPreferredSize(new Dimension(400, 400));
            scroller = new JScrollBar(1, 0, 15, 0, 50);
            add(chartpanel);
            scroller.getModel().addChangeListener(this);
            JPanel jpanel = new JPanel(new BorderLayout());
            jpanel.add(scroller);
            jpanel.setBorder(BorderFactory.createEmptyBorder(66, 2, 2, 2));
            add(jpanel, "East");
        }
    }
 
 
    public SlidingGanttDatasetDemo1(String s)
    {
        super(s);
        setDefaultCloseOperation(3);
        setContentPane(createDemoPanel());
    }
 
    public static JPanel createDemoPanel()
    {
        return new DemoPanel();
    }
 
    public static void main(String args[])
    {
        SlidingGanttDatasetDemo1 slidingganttdatasetdemo1 = new SlidingGanttDatasetDemo1("JFreeChart: SlidingGanttDatasetDemo1.java");
        slidingganttdatasetdemo1.pack();
        RefineryUtilities.centerFrameOnScreen(slidingganttdatasetdemo1);
        slidingganttdatasetdemo1.setVisible(true);
    }
}

Ich habe versucht dass obere Beispiel auf XYLine Chart zu übertragen, aber leider bin ich gescheitert. Gibt es eine Möglichkeit XYLine Chart komplett zu sehen und nur in der x-Achse entlang scrollen?
 
Zuletzt bearbeitet:
S

SlaterB

Gast
in der Richtung kann ich persönlich nicht weiterhelfen, wie gesagt,
beim ScrollPane kannst du noch versuchen, die Größenangaben anzupassen,

wenn die Chart sehr breit ist, dann setzte vielleicht die PreferredSize des ChartPanels auf 1000x400
und die des JScrollPanes bzw. des JFrames im einfachen Beispiel auf 400x400,
je nachdem wie es mit dem Höhenverhältnis passt verschwindet die vertikale Scrollachse, vertikal ist alles zu sehen
und man kann nur links/rechs scrollen,

wenn es mit meinen Angaben nicht klappt, dann ruhig bisschen mehr ausprobieren,
die Zeile
> chartPanel.setPreferredSize(new Dimension(800, 370));
aus 83 kann auch ruhig nach oben vor die Definion des JScrollPanes, dann hast du dir beiden Size-Kommandos nahe zusammen

---

wenn ein Teil der Chart immer zu sehen sein soll (Achse), dann wirds natürlich komplizierter,
dann wirklich besser direkte JFreeChart-Angebote, sofern vorhanden,
manuell nachgebaut müsste man da ganz schön tricksen, die Chart zweimal malen und abschneiden usw.,
wollen wir lieber nicht vertiefen ;)
 

flashdog

Bekanntes Mitglied
Ich habe hier im Forum ( http://www.java-forum.org/awt-swing-swt/42568-scrollbalken-will-so-ganz-richtig.html ) ein ähnliches Beispiel gefunden welches unter anderem eine verschiebbare x-Achse hat. So ich habe versucht einige Zeilen zu kopieren und anzupassen, aber leider bekomme ich diese Fehlermeldung:
Java:
Exception in thread "main" java.lang.NullPointerException
	at MySlidingCategoryDatasetDemo2$DemoPanel.createChart(MySlidingCategoryDatasetDemo2.java:96)
	at MySlidingCategoryDatasetDemo2$DemoPanel.<init>(MySlidingCategoryDatasetDemo2.java:148)
	at MySlidingCategoryDatasetDemo2.createDemoPanel(MySlidingCategoryDatasetDemo2.java:170)
	at MySlidingCategoryDatasetDemo2.<init>(MySlidingCategoryDatasetDemo2.java:166)
	at MySlidingCategoryDatasetDemo2.main(MySlidingCategoryDatasetDemo2.java:174)

Sobald ich die Zeilen 96 and 97 auskommentiere funktioniert der Code, aber der Scroll Balken verschiebt nicht die x-Achse.

Java:
//

import java.awt.*;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import org.jfree.chart.*;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.event.ChartChangeListener;
import org.jfree.chart.plot.CombinedDomainXYPlot;
import org.jfree.chart.plot.Plot;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.StandardXYItemRenderer;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.category.*;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RefineryUtilities;

public class MySlidingCategoryDatasetDemo2 extends ApplicationFrame {
  static class DemoPanel extends JPanel implements ChangeListener {
    private static XYDataset createDataset() {
      XYSeries xyseries = new XYSeries("First");
      xyseries.add(1.0D, 1.0D);
      xyseries.add(2D, 4D);
      xyseries.add(3D, 3D);
      xyseries.add(4D, 5D);
      xyseries.add(5D, 5D);
      xyseries.add(6D, 7D);
      xyseries.add(7D, 7D);
      xyseries.add(8D, 8D);
      xyseries.add(9D, 8D);
      xyseries.add(10D, 8D);
      xyseries.add(11D, 8D);
      xyseries.add(12D, 8D);
      xyseries.add(13D, 8D);
      xyseries.add(14D, 8D);
      xyseries.add(15D, 8D);
      xyseries.add(16D, 25D);
      xyseries.add(17D, 8D);
      xyseries.add(18D, 5D);
      xyseries.add(19D, 7D);
      xyseries.add(20D, 6D);
      xyseries.add(21D, 8D);
      xyseries.add(22D, 4D);
      xyseries.add(23D, 4D);
      xyseries.add(24D, 2D);
      xyseries.add(25D, 1.0D);
      xyseries.add(26D, 8D);
      xyseries.add(27D, 8D);
      xyseries.add(28D, 8D);
      xyseries.add(29D, 8D);
      xyseries.add(30D, 8D);
      xyseries.add(31D, 8D);
      xyseries.add(32D, 25D);
      xyseries.add(33D, 8D);
      xyseries.add(34D, 5D);
      xyseries.add(35D, 7D);
      xyseries.add(36D, 6D);
      xyseries.add(37D, 8D);
      xyseries.add(38D, 4D);
      xyseries.add(39D, 4D);
      xyseries.add(40D, 2D);
      xyseries.add(41D, 1.0D);

      XYSeriesCollection xyseriescollection = new XYSeriesCollection();
      xyseriescollection.addSeries(xyseries);

      return xyseriescollection;
    }

    private static JFreeChart createChart(XYDataset xydataset) {
      final CombinedDomainXYPlot xyplot = new CombinedDomainXYPlot();
      NumberAxis rangeAxis1 = new NumberAxis();
      rangeAxis1.setLowerBound(0);
      rangeAxis1.setUpperBound(30);

      final XYPlot subplot1 = new XYPlot(xydataset, null, rangeAxis1,
          new StandardXYItemRenderer());

      xyplot.add(subplot1);
      final JFreeChart jfreechart = new JFreeChart("Hello",
          JFreeChart.DEFAULT_TITLE_FONT, xyplot, true);
      // JFreeChart jfreechart =
      // ChartFactory.createXYLineChart("Line Chart Demo 2", "X", "Y",
      // xydataset, PlotOrientation.VERTICAL, true, true, false);
      // XYPlot xyplot = (XYPlot)jfreechart.getPlot();
      //
      xyplot.setDomainPannable(true);
      xyplot.setRangePannable(true);
      XYLineAndShapeRenderer xylineandshaperenderer = (XYLineAndShapeRenderer) xyplot
          .getRenderer();
      xylineandshaperenderer.setBaseShapesVisible(true);
      xylineandshaperenderer.setBaseShapesFilled(true);
      // NumberAxis numberaxis = (NumberAxis)xyplot.getRangeAxis();
      // numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
      // numberaxis.setRange(0.0D, 100D);
      ValueAxis valueaxis = xyplot.getDomainAxis();
      // valueaxis.setLowerMargin(0.34999999999999998D);
      valueaxis.setLowerBound(0);
      valueaxis.setUpperBound(60);
      return jfreechart;
    }

    public void stateChanged(ChangeEvent changeevent) {
      // dataset.setFirstCategoryIndex(scroller.getValue());
      BoundedRangeModel scrollBarModel = scroller.getModel();
      try {
        Object src = changeevent.getSource();
        if (src == scrollBarModel) {
          int val = scrollBarModel.getValue();
          int ext = scrollBarModel.getExtent();

          System.out.println(val);
          System.out.println(ext);

          Plot plot = this.chartpanel.getChart().getPlot();
          if (plot instanceof XYPlot) {
            XYPlot hvp = (XYPlot) plot;
            ValueAxis axis = hvp.getDomainAxis();

            this.chartpanel.getChart().removeChangeListener(
                (ChartChangeListener) this);

            axis.setRange(val / this.xscrollFactor, (val + ext)
                / this.xscrollFactor);

            this.chartpanel.getChart().addChangeListener(
                (ChartChangeListener) this);
          }
        }
      } catch (Exception e) {
        e.printStackTrace();
      }

    }

    JScrollBar scroller;
    SlidingCategoryDataset dataset;
    ChartPanel chartpanel;
    double xscrollFactor = 50;

    public DemoPanel() {
      super(new BorderLayout());
      JFreeChart jfreechart = createChart(createDataset());
      chartpanel = new ChartPanel(jfreechart);

      // chartpanel.setPreferredSize(new Dimension(400, 400));
      scroller = new JScrollBar(JScrollBar.HORIZONTAL);// (0, 0, 10, 0, 50);
      add(chartpanel);
      scroller.getModel().addChangeListener(this);
      JPanel jpanel = new JPanel(new BorderLayout());
      jpanel.add(scroller);
      jpanel.setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2));
      jpanel.setBackground(Color.white);
      add(jpanel, "South");
    }
  }

  public MySlidingCategoryDatasetDemo2(String s) {
    super(s);
    setDefaultCloseOperation(3);
    setContentPane(createDemoPanel());
  }

  public static JPanel createDemoPanel() {
    return new DemoPanel();
  }

  public static void main(String args[]) {
    MySlidingCategoryDatasetDemo2 slidingcategorydatasetdemo2 = new MySlidingCategoryDatasetDemo2(
        "JFreeChart: SlidingCategoryDatasetDemo2.java");
    slidingcategorydatasetdemo2.pack();
    RefineryUtilities.centerFrameOnScreen(slidingcategorydatasetdemo2);
    slidingcategorydatasetdemo2.setVisible(true);
  }
}

Was habe ich vergessen?
 
S

SlaterB

Gast
der Renderer ist nicht gesetzt, getRenderer() liefert null,
new StandardXYItemRenderer() soll dabei wohl helfen, im anderen Thread ist das beim einzigen Plot gesetzt, bei dir nur in einem SubPlot, was immer das ist,

räum deine Plot-Menge auf oder versuche (auch) beim Hauptplot den Renderer zu setzen,
java-mäßig kann ich dazu selber gerade nichts testen, nur darauf hinweisen
 

Ähnliche Java Themen

Neue Themen


Oben