2011-03-28 23 views
2

我使用JFreeChart在柱狀圖中顯示一些簡單的數據。我在將數據集加載到圖表並顯示數據時沒有問題,但是當我嘗試使用複選框對數據進行排序時,我的問題就出現了。選中時,應顯示來自year2001的數據,如果取消選中,應顯示來自所有年份的數據。從執行println,我可以看到複選框正在工作,並且來自Persons.getPersons().getCountSuccessYesMale()的數據已更改,但圖表未重新加載新數據。這裏有什麼問題?jFreeChart刷新數據集問題

public class ChartColumn extends JPanel { 

private JCheckBox year2001; 
private JCheckBox year2002; 
private EventListener eventListener; 
private int successMale; 

public ChartColumn(EventListener eventListener) { 
    this.eventListener = eventListener; 
} 

public void update() { 
    this.createChart(this.createDataset()); 
    this.showSelectionControl(); 
} 

private CategoryDataset createDataset() { 

    DefaultCategoryDataset dataset = new DefaultCategoryDataset(); 

    dataset.addValue(Persons.getPersons().getCountSuccessYesMale(), "Success", "MALE"); 
    dataset.addValue(Persons.getPersons().getCountSuccessNoMale(), "Fail", "MALE"); 
    dataset.addValue(Persons.getPersons().getCountSuccessYesFemale(), "Success", "FEMALE"); 
    dataset.addValue(Persons.getPersons().getCountSuccessNoFemale(), "Fail", "FEMALE"); 

    return dataset; 

} 

public void createChart(CategoryDataset dataset) { 

    JFreeChart chart = 
      ChartFactory.createBarChart3D(
      "Comparison between Male and Female in attending Meetings", 
      "Person Comparisons", 
      "No of Persons", 
      dataset, 
      PlotOrientation.VERTICAL, 
      true, 
      true, 
      false); 

    ChartPanel chartPanel = new ChartPanel(chart); 
    chartPanel.setPreferredSize(new Dimension(600, 300)); 

    this.add(chartPanel); 

} 

public void showSelectionControl() { 

    year2001 = new JCheckBox("2001"); 
    year2001.setMnemonic(KeyEvent.VK_C); 
    year2001.setSelected(true); 
    year2001.setActionCommand("2001"); 
    year2001.addActionListener((ActionListener) this.eventListener); 

    year2002 = new JCheckBox("2002"); 
    year2002.setMnemonic(KeyEvent.VK_G); 
    year2002.setSelected(true); 
    year2002.setActionCommand("2002"); 
    year2002.addActionListener((ActionListener) this.eventListener); 

    this.add(year2001); 
    this.add(year2002); 
} 
} 

事件監聽其打電話的時候複選框有變化狀態的更新方法:

class TabbedPaneEvent implements ActionListener { 

    public void actionPerformed(ActionEvent actionEvent) { 
     if (actionEvent.getActionCommand().equals("2001")) { 
      AbstractButton abstractButton = (AbstractButton)actionEvent.getSource(); 
      boolean selected = abstractButton.getModel().isSelected(); 

      if(selected == true){ 
       Persons.setYear(1); 
      } else if(selected == false){ 
       Persons.setYear(0); 
      } 


      Persons.calculateChartData(); 
      chartColumn.update(); 


     } 
    } 

回答

4

看起來你是不是刪除舊的圖表。可以在更新方法中調用removeAll(),或者更新圖表的數據集,而不是重新生成圖表。

+0

是的,這幾乎工作。使用removeAll()時的問題是複選框(checked/unchecked)的狀態被刪除。我怎樣才能刪除/更新數據集? – jorgen 2011-03-28 12:46:01

+3

而不是每次創建一個新的數據集,創建一次,然後清除並添加新的值。 – jzd 2011-03-28 12:48:36

+0

是的!不能相信我以前沒有這樣做!非常感謝! – jorgen 2011-03-28 12:55:33