将图表绑定到TableView JavaFX

时间:2014-05-30 23:40:30

标签: javafx

我有一个包含数据的TableView,并希望PieChart可视化该表中的数据。我无法理解我应该如何将TableView中的arraylist绑定到Piechart,因为TableView需要getter和setter,而piechart需要PieChart.Data可观察列表。

这是我目前的代码,元素是用Scene Builder设计的

@FXML
private TableView<Record> tableView;



static ObservableList<Record> dataen
        = FXCollections.observableArrayList(
                new Record("January", 100),
                new Record("February", 200));




public void initialize(URL url, ResourceBundle rb) {

    Month.setCellValueFactory(new PropertyValueFactory("fieldMonth"));
    Value.setCellValueFactory(new PropertyValueFactory("fieldValue"));
    tableView.setItems(dataen);

}

}

1 个答案:

答案 0 :(得分:2)

在TableView项目列表(dataen)上创建一个监听器,或者只为两者使用相同的列表。他们在这里使用相同的列表。您可以将列表更改为<PieChart.Data>类型而不是<Record>,否则请使用侦听器。

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.chart.PieChart;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.control.cell.TextFieldTableCell;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.util.converter.NumberStringConverter;

public class ChangePie extends Application {

    @Override
    public void start(Stage primaryStage) {
        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");

        TableView tv = new TableView(pieChartData);
        tv.setEditable(true);

        TableColumn tc1 = new TableColumn("Name");
        tc1.setPrefWidth(100);
        tc1.setCellValueFactory(new PropertyValueFactory("name"));
        tc1.setCellFactory(TextFieldTableCell.forTableColumn());

        TableColumn tc2 = new TableColumn("Data");
        tc2.setPrefWidth(100);
        tc2.setCellValueFactory(new PropertyValueFactory("pieValue"));
        tc2.setCellFactory(TextFieldTableCell.forTableColumn(new NumberStringConverter()));

        tv.getColumns().addAll(tc1,tc2);
        Scene scene = new Scene(new VBox(chart,tv));
        primaryStage.setScene(scene);
        primaryStage.show();
    }

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

}