在观察者中动态更新饼图?

时间:2019-04-01 15:49:30

标签: java dynamic jfreechart pie-chart swingx

我正在使用饼图通过JFreeChart软件包在JFrame中显示一些统计信息。我正在使用PieDataset传递给createChart方法。同样,数据集设置为动态更新,因为我在应用程序中使用了观察者模式,并对其进行了彻底调试。我的问题是,尽管能够动态更新数据集,但框架上的饼图无法按原样更新,也许无法采用新的(更新的)值并显示结果。我想知道是否还有其他方法可以动态更新饼图。

public void update(Observable observable, Object o) {
    if (o instanceof Game || o instanceof GameController) {
        String label = "<html><head><h1>World Domination View</h1></head><body> ";

        territoriesList = Game.getInstance().getGameMap().getTerritories();
        String[] name = new String[Game.getInstance().getNumPlayers()] ;
        Float[] value = new Float[Game.getInstance().getNumPlayers()];
        for (int i = 0; i < Game.getInstance().getNumPlayers(); i++) {
            int tempTerritoryCount = 0;
            float percentage = 0;

            for (Territory territory : territoriesList) {
                if (territory.getOwner() == Game.getInstance().getPlayerById(i)) {
                    tempTerritoryCount += 1;
                }
            }
            percentage = (float) 100.0 * tempTerritoryCount / Game.getInstance().getGameMap().getTerritories().size();
            label = label + Game.getInstance().getPlayerById(i).getName() + " owns " + percentage
                    + " % territories and owns " + PhaseView.getInstance().curPArmies + "<br/>";
            worldDominationViewLabel.setText(label);
            //dt = createDataset(Game.getInstance().getPlayerById(i).getName(),percentage);

            //createDataset(Game.getInstance().getPlayerById(i).getName(),percentage);
            //for(int j=0; j<Game.getInstance().getNumPlayers();j++){
                name[i] = Game.getInstance().getPlayerById(i).getName();
            //}
            if(name[i] != null)
        {
            value[i] = percentage;
        }


    }
    dt = createDataset(name,value);
    chartPanel = new ChartPanel(createChart(dt));
    chartPanel.setBounds(1024,0,310,300);//390
    chartPanel.setVisible(true);
    frameFromPhase.add(chartPanel);
    worldDominationViewLabel.setText(label + "</body></html>");}}

//the dataset definition
public static PieDataset createDataset(String[] plname,Float[] value){
    DefaultPieDataset dataset = new DefaultPieDataset();
    for(int i =0; i< plname.length;i++){
        dataset.setValue(plname[i],value[i]);

    }
    return dataset;
}

//chart definition
public static JFreeChart createChart(PieDataset dataset ) {
    JFreeChart chart = ChartFactory.createPieChart(
            "Player Map Domination: Territorywise",   // chart title
            dataset,          // data
            true,             // include legend
            true,
            false);

    return chart;
}

1 个答案:

答案 0 :(得分:1)

请按照here的建议,不要每次更改都创建一个新的数据集和图表;相反,“更新图表的数据模型public class Complex implements Number<Complex> { @Override public Complex add(Complex c) { ... } } ,然后将监听视图”。 Observer接口的实现可以使用其PieDataset方法来更新统计图的模型,就像update()的操作处理程序一样。从这个完整的example开始,我在JButton上添加了一个空饼图,并修改了View以通过在统计图数据集上调用update()来跟踪猜测。

image

setValue()