2010-10-18 100 views
1

我大部分時間都在閱讀「JFreeChart類庫v1.0.13開發人員指南」和相關示例。 我相信我知道如何創建圖表,我只是不清楚如何在JFrame JLabel中顯示它。 當我嘗試這樣做如何在JFrame中顯示JFreeChart JLabel

LineChartDemo1 chart = new LineChartDemo1("Chart title"); 
jLabelChart.add(chart); 
chart.setVisible(true); 

我在線程 「AWT-EventQueue的 - 0」 java.lang.IllegalArgumentException異常有

例外: 將窗口添加到容器

我看到我所嘗試的是非法的,但我應該用什麼方法來顯示圖表?我應該不使用JLabel嗎?

/** 
* A simple demonstration application showing how to create a line chart using 
* data from a {@link CategoryDataset}. 
*/ 
public class LineChartDemo1 extends ApplicationFrame { 

    /** 
    * Creates a new demo. 
    * 
    * @param title the frame title. 
    */ 
    public LineChartDemo1(String title) { 
     super(title); 
     JPanel chartPanel = createDemoPanel(); 
     chartPanel.setPreferredSize(new Dimension(500, 270)); 
     setContentPane(chartPanel); 
    } 

    /** 
    * Creates a sample dataset. 
    * 
    * @return The dataset. 
    */ 
    private static CategoryDataset createDataset() { 
     DefaultCategoryDataset dataset = new DefaultCategoryDataset(); 
     dataset.addValue(212, "Classes", "JDK 1.0"); 
     dataset.addValue(504, "Classes", "JDK 1.1"); 
     dataset.addValue(1520, "Classes", "JDK 1.2"); 
     dataset.addValue(1842, "Classes", "JDK 1.3"); 
     dataset.addValue(2991, "Classes", "JDK 1.4"); 
     dataset.addValue(3500, "Classes", "JDK 1.5"); 
     return dataset; 
    } 

    /** 
    * Creates a sample chart. 
    * 
    * @param dataset a dataset. 
    * 
    * @return The chart. 
    */ 
    private static JFreeChart createChart(CategoryDataset dataset) { 

     // create the chart... 
     JFreeChart chart = ChartFactory.createLineChart(
      "Java Standard Class Library", // chart title 
      null,      // domain axis label 
      "Class Count",     // range axis label 
      dataset,       // data 
      PlotOrientation.VERTICAL,  // orientation 
      false,       // include legend 
      true,       // tooltips 
      false       // urls 
     ); 

     chart.addSubtitle(new TextTitle("Number of Classes By Release")); 
     TextTitle source = new TextTitle(
       "Source: Java In A Nutshell (5th Edition) " 
       + "by David Flanagan (O'Reilly)"); 
     source.setFont(new Font("SansSerif", Font.PLAIN, 10)); 
     source.setPosition(RectangleEdge.BOTTOM); 
     source.setHorizontalAlignment(HorizontalAlignment.RIGHT); 
     chart.addSubtitle(source); 

     CategoryPlot plot = (CategoryPlot) chart.getPlot(); 
     plot.setRangePannable(true); 
     plot.setRangeGridlinesVisible(false); 
     URL imageURL = LineChartDemo1.class.getClassLoader().getResource(
      "OnBridge11small.png"); 
     if (imageURL != null) { 
      ImageIcon temp = new ImageIcon(imageURL); 
      // use ImageIcon because it waits for the image to load... 
      chart.setBackgroundImage(temp.getImage()); 
      plot.setBackgroundPaint(null); 
     } 
     // customise the range axis... 
     NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis(); 
     rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits()); 

     ChartUtilities.applyCurrentTheme(chart); 

     // customise the renderer... 
     LineAndShapeRenderer renderer 
       = (LineAndShapeRenderer) plot.getRenderer(); 
     renderer.setBaseShapesVisible(true); 
     renderer.setDrawOutlines(true); 
     renderer.setUseFillPaint(true); 
     renderer.setBaseFillPaint(Color.white); 
     renderer.setSeriesStroke(0, new BasicStroke(3.0f)); 
     renderer.setSeriesOutlineStroke(0, new BasicStroke(2.0f)); 
     renderer.setSeriesShape(0, new Ellipse2D.Double(-5.0, -5.0, 10.0, 10.0)); 
     return chart; 
    } 

    /** 
    * Creates a panel for the demo (used by SuperDemo.java). 
    * 
    * @return A panel. 
    */ 
    public static JPanel createDemoPanel() { 
     JFreeChart chart = createChart(createDataset()); 
     ChartPanel panel = new ChartPanel(chart); 
     panel.setMouseWheelEnabled(true); 
     return panel; 
    } 

    /** 
    * Starting point for the demonstration application. 
    * 
    * @param args ignored. 
    */ 
    public static void main(String[] args) { 
     LineChartDemo1 demo = new LineChartDemo1(
       "JFreeChart: LineChartDemo1.java"); 
     demo.pack(); 
     RefineryUtilities.centerFrameOnScreen(demo); 
     demo.setVisible(true); 
    } 

} 

回答

2

你的示例代碼工作完美,但我沒有看到任何一點在把你的ChartPanel(的JPanel子類)在JLabel。請注意,LineChartDemo1 extends ApplicationFrameJFrame的一個子類)繼承了後者的默認BorderLayout。您可以將圖表添加到中心並相應地放置其他組件。

public LineChartDemo1(String title) { 
    super(title); 
    JPanel chartPanel = createDemoPanel(); 
    chartPanel.setPreferredSize(new Dimension(500, 270)); 
    this.add(chartPanel, BorderLayout.CENTER); 
    this.add(new JLabel("Mouse wheel!", JLabel.CENTER), BorderLayout.SOUTH); 
} 

這裏有一個相關的demo,也不要忽視在org.jfree.chart.demo的例子。爲方便起見,每個API文檔都鏈接到相應的源代碼。