2012-09-13 2 views
1

모든 xtick을 유지하기 때문에 화면에 맞지 않는 큰 데이터 세트를 보려면 스크롤 막대를 차트에 추가하고 싶습니다. 다음 코드스크롤러가있는 Jfreechart가 발생했습니다

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) 

:

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); 
} 
} 

내가 무슨 일을 했는가 그러나, 나는 다음과 같은 오류 메시지가 있어요?

미리 감사드립니다. CombinedDomainXYPlot이 렌더러를 가지고 있지 않습니다 xyplot라는 이름 때문에

+0

+1. – trashgod

답변

1

NullPointerException가 발생; 그 서브 플롯들에만 렌더러가 있습니다. xyplot의 유일한 서브 플로트는 subplot1이라는 XYPlot이며 표준 렌더러는 StandardXYItemRenderer입니다. createChart()에서 다음과 같이 조건을 지정할 수 있습니다. [sscce] (http://sscce.org/)의 경우

StandardXYItemRenderer renderer = 
    (StandardXYItemRenderer) subplot1.getRenderer(); 
renderer.setBaseShapesVisible(true); 
renderer.setBaseShapesFilled(true); 
+0

감사합니다. 이제 다음 오류 메시지가 나타납니다. "main"스레드의 예외 java.lang.ClassCastException : org.jfree.data.xy.XYSeriesCollection을 org.jfree.data.category.CategoryDataset \t의 MySlidingCategoryDatasetDemo3 $ DemoPanel에 캐스팅 할 수 없습니다. (MySlidingCategoryDatasetDemo3.java:102) MySlidingCategoryDatasetDemo3에서 MySlidingCategoryDatasetDemo3.createDemoPanel (MySlidingCategoryDatasetDemo3.java:128) \t에서 \t. (MySlidingCategoryDatasetDemo3.java:123) MySlidingCategoryDatasetDemo3.main (MySlidingCategoryDatasetDemo3.java:133) \t 내가 무슨 일을 했는가에 \t? – user977828

+0

이 결과가 표시되지 않습니다. 업데이트 된 코드 및 스택 추적으로 새로운 질문을 제기 할 수 있습니다. – trashgod

관련 문제