Я использую круговую диаграмму для отображения статистики в JFrame
с помощью пакета JFreeChart.Я использую 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;
}