2012-04-19 47 views
0

我有四类: - 的ChartService - CSVReader - 文件选择 - ChartPanel如何在加载文件后刷新ChartPanel类中的图表?

我的问题是,我不知道如何来刷新ChartPanel类图中的文件选择器类加载文件之后。我尝试了不同的方式,但图表没有出现。

请帮忙!!!

的ChartService类别:

public void initializeChart() { 
     final CombinedDomainXYPlot plot = new CombinedDomainXYPlot(new DateAxis("Time")); 
     this.datasets = new TimeSeriesCollection[SUBPLOT_COUNT]; 

     for (int i = 0; i < SUBPLOT_COUNT; i++) { 
      final TimeSeries series = sensorXseries; 

      this.datasets[i] = new TimeSeriesCollection(series); 
      final NumberAxis rangeAxis = new NumberAxis(Y_AXIS_TITLES[i]); 
      rangeAxis.setAutoRangeIncludesZero(false); 
      final XYPlot subplot = new XYPlot(
        this.datasets[i], null, rangeAxis, new StandardXYItemRenderer() 
      ); 

      subplot.setBackgroundPaint(Color.lightGray); 
      subplot.setDomainGridlinePaint(Color.white); 
      subplot.setRangeGridlinePaint(Color.white); 
      plot.add(subplot); 
     } 

     final JFreeChart chart = new JFreeChart("Charts", plot); 

     chart.setBorderPaint(Color.black); 
     chart.setBorderVisible(true); 
     chart.setBackgroundPaint(Color.white); 

     plot.setBackgroundPaint(Color.lightGray); 
     plot.setDomainGridlinePaint(Color.white); 
     plot.setRangeGridlinePaint(Color.white); 

     final ValueAxis axis = plot.getDomainAxis(); 
     axis.setAutoRange(false); 

     chartPanel = new ChartPanel(chart); 

     chartPanel.setPreferredSize(new java.awt.Dimension(790, 620)); 
     chartPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); 
     this.add(chartPanel); 
    } 
    public TimeSeries createFirstDataSet(ArrayList<DataObject> data) { 
     sensorXseries = new TimeSeries("Acceleration X"); 
     for(int i=0; i < data.size(); i++) { 
      sensorXseries.add(new Millisecond(convertToTimestamp(data.get(i).getStoper())), data.get(i).getAccelerationX()); 
     } 
     return sensorXseries; 
    } 

    public TimeSeries createSecondDataSet(ArrayList<DataObject> data) { 
     TimeSeries sensorYseries = new TimeSeries("Acceleration Y"); 
     for(int i=0; i < data.size(); i++) { 
      sensorYseries.add(new Millisecond(convertToTimestamp(data.get(i).getStoper())), data.get(i).getAccelerationY()); 
     } 
     return sensorYseries; 
    } 

    public TimeSeries createThirdDataSet(ArrayList<DataObject> data) { 
     TimeSeries sensorZseries = new TimeSeries("Acceleration Z"); 
     for(int i=0; i < data.size(); i++) { 
      sensorZseries.add(new Millisecond(convertToTimestamp(data.get(i).getStoper())), data.get(i).getAccelerationZ()); 
     } 
     return sensorZseries; 
    } 

    public void refreshChartPanel() { 
     chartPanel.repaint(); 
    } 

使用FileChooser类:

public void loadFile() throws Exception { 
    fileChooser = new JFileChooser(); 
    fileChooser.addChoosableFileFilter(new FileNameExtensionFilter("CSV Files", "csv")); 

    int returnVal = fileChooser.showOpenDialog(this); 

    if (returnVal == JFileChooser.APPROVE_OPTION) { 
     File file = fileChooser.getSelectedFile(); 
     fileName= file.getAbsolutePath(); 
     CSVReader csvReader = new CSVReader(fileName); 
     chartService = new ChartService(); 
     chartService.createFirstDataSet(csvReader.getLinesFromFile()); 
    } 

} 

CSVReader类:

public CSVReader(String fileName) { 
     this.fileName = fileName; 
    } 

    public ArrayList getLinesFromFile() throws Exception { 
     inFile = new CsvBeanReader(new FileReader(fileName), CsvPreference.EXCEL_PREFERENCE); 
     final String[] header = inFile.getCSVHeader(true); 

     CellProcessor [] processors = {null, new ParseDouble(), new ParseDouble(), new ParseDouble(), new ParseInt(), new ParseInt()}; 

     dataObjectArray = new ArrayList<DataObject>(); 
     while((dataObject = inFile.read(DataObject.class, header, processors)) != null) { 
      dataObjectArray.add(dataObject); 
     } 
     return dataObjectArray; 
    } 

ChartPanel类:

public ChartPanel() { 
     initializeChartPanel(); 
    } 

    private void initializeChartPanel() { 

     setBorder(BorderFactory.createTitledBorder("Chart:")); 
     setPreferredSize(new Dimension(824, 0)); 
     ChartService chartService = new ChartService(); 
     chartService.initializeChart(); 

     this.add(chartService); 
    } 

回答

4

将您的图表添加到org.jfree.chart.ChartPanel,它扩展了JPanel,并“向图表注册以接收对图表任何组件的更改通知。”正如在此example中,数据集通常在更新时默认提供此通知。您的ChartPanel似乎没有注册任何听众。

+1

或try,setVisible(true)or updateUI() – 2012-04-19 15:15:02

+1

@ Christian'fuzi'Orgler:'setVisible()'可能会丢失;缺席[sscce](http://sscce.org/)我们只能猜测。 'JFreeChart'不是'JComponent',所以'updateUI()'似乎是偶然的。 – trashgod 2012-04-19 17:40:46