2014-01-21 4 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

Я голосую, потому что идея интересная, но вопрос слишком домашнее задание-иш. Скорее всего, вы должны установить новые значения на диаграмме, а затем развернуть все это снова. Но я не знаю API JavaFX. – GGrec

ответ

4

Насколько я мог видеть, все классы, которые используются для установления PieChart, как PieChart.Data и конечно ObservableList уже разработаны таким образом, что они будут обновлять PieChart момент что-то меняется, будь то самого списка или значений внутри объектов Data. См. the binding chapters, как это делается. Но вам не нужно писать свои собственные привязки для PieChart.

Код ниже должен делать то, что вы хотите. Используйте addData(String name, double value), чтобы создать новый объект Data для вашей круговой диаграммы или обновить существующий, который имеет тот же самый name, что и первый параметр метода. PieChart будет автоматически воспроизводить анимацию при внесении изменений в список (добавлен новый объект 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

Мне очень нужна помощь. Я не могу заставить этот код работать. –

Смежные вопросы