2014-01-21 85 views
3

我想創建非常有用和簡單的方式來實時更新餅圖。例如:實時更新餅圖

import javafx.application.Application; 
import javafx.collections.FXCollections; 
import javafx.collections.ObservableList; 
import javafx.event.EventHandler; 
import javafx.scene.Group; 
import javafx.scene.Scene; 
import javafx.scene.chart.PieChart; 
import javafx.scene.control.Label; 
import javafx.scene.input.MouseEvent; 
import javafx.scene.paint.Color; 
import javafx.stage.Stage; 


public class MainApp extends Application { 

    @Override 
    public void start(Stage stage) { 
     Scene scene = new Scene(new Group()); 
     stage.setTitle("Imported Fruits"); 
     stage.setWidth(500); 
     stage.setHeight(500); 

     ObservableList<PieChart.Data> pieChartData = 
       FXCollections.observableArrayList(
       new PieChart.Data("Grapefruit", 13), 
       new PieChart.Data("Oranges", 25), 
       new PieChart.Data("Plums", 10), 
       new PieChart.Data("Pears", 22), 
       new PieChart.Data("Apples", 30)); 

     final PieChart chart = new PieChart(pieChartData); 
     chart.setTitle("Imported Fruits"); 
     final Label caption = new Label(""); 
     caption.setTextFill(Color.DARKORANGE); 
     caption.setStyle("-fx-font: 24 arial;"); 

     for (final PieChart.Data data : chart.getData()) { 
      data.getNode().addEventHandler(MouseEvent.MOUSE_PRESSED, 
        new EventHandler<MouseEvent>() { 
         @Override public void handle(MouseEvent e) { 
          caption.setTranslateX(e.getSceneX()); 
          caption.setTranslateY(e.getSceneY()); 
          caption.setText(String.valueOf(data.getPieValue()) 
           + "%"); 
         } 
        }); 
     } 

     ((Group) scene.getRoot()).getChildren().addAll(chart, caption); 
     stage.setScene(scene); 
     stage.show(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 

當我展示我要調用Java方法和更新圖表這樣的圖表:

PieChartUpdate(valueOne, valueTwo, valueThree); 

你能告訴我我該怎麼才能讓編輯代碼實時更新更易於使用?

+0

到目前爲止,您嘗試了哪些方法?您在嘗試操作時遇到了哪些問題? –

+2

我正在投票,因爲這個主意很有趣,但問題在於家庭作業。很可能你應該在圖表上設置新的值,然後重新佈局整個事情。但是我不瞭解JavaFX API。 – GGrec

回答

4

至於我能看到的,用於建立一個PieChart,像PieChart.Data當然所有類的ObservableList已經設計,使他們將更新PieChart時刻有新的變化,無論是列表本身或值在Data對象內。請參閱the binding chapters這是如何完成的。但是你不需要爲PieChart編寫自己的綁定。

下面的代碼應該做你想做的。使用addData(String name, double value)爲您的餅圖創建新的Data對象,或更新與方法的第一個參數相同的namePieChart將在對列表進行更改時自動播放動畫(添加了新的Data對象)或更改了對象Data

//adds new Data to the list 
public void naiveAddData(String name, double value) 
{ 
    pieChartData.add(new Data(name, value)); 
} 

//updates existing Data-Object if name matches 
public void addData(String name, double value) 
{ 
    for(Data d : pieChartData) 
    { 
     if(d.getName().equals(name)) 
     { 
      d.setPieValue(value); 
      return; 
     } 
    } 
    naiveAddData(name, value); 
} 
+0

你可以粘貼完整的代碼嗎?這個'pieChartData'不正確。 –

+0

我想你可以自己做。聲明'pieChartData'作爲'MainApp'類的新屬性。這只是對你的代碼的一個小改動。 – denhackl

+0

我真的需要幫助。我不能讓這個代碼工作。 –