001package ca.bc.webarts.javaFX;
002
003import java.util.Arrays;
004import javafx.application.Application;
005import javafx.collections.FXCollections;
006import javafx.collections.ObservableList;
007import javafx.event.EventHandler;
008import javafx.scene.Group;
009import javafx.scene.Scene;
010import javafx.scene.chart.*;
011import javafx.scene.control.*;
012import javafx.scene.control.cell.PropertyValueFactory;
013import javafx.scene.input.KeyCode;
014import javafx.scene.input.KeyEvent;
015import javafx.scene.layout.HBox;
016import javafx.stage.Stage;
017import javafx.util.Callback;
018
019/**
020*
021* @web http://java-buddy.blogspot.com/
022*/
023public class JavaFX_TableView extends Application {
024
025    private TableView<XYChart.Data> tableView = new TableView<>();
026
027    private ObservableList<XYChart.Data> dataList =
028            FXCollections.observableArrayList(
029                new XYChart.Data("January", 100),
030                new XYChart.Data("February", 200),
031                new XYChart.Data("March", 50),
032                new XYChart.Data("April", 75),
033                new XYChart.Data("May", 110),
034                new XYChart.Data("June", 300),
035                new XYChart.Data("July", 111),
036                new XYChart.Data("August", 30),
037                new XYChart.Data("September", 75),
038                new XYChart.Data("October", 55),
039                new XYChart.Data("November", 225),
040                new XYChart.Data("December", 99));
041
042    /**
043    * @param args the command line arguments
044    */
045    public static void main(String[] args) {
046        launch(args);
047    }
048
049    @Override
050    public void start(Stage primaryStage) {
051        primaryStage.setTitle("java-buddy.blogspot.com");
052        Group root = new Group();
053
054        tableView.setEditable(true);
055        Callback<TableColumn, TableCell> cellFactory =
056            new Callback<TableColumn, TableCell>() {
057                @Override
058                public TableCell call(TableColumn p) {
059                    return new EditingCell();
060                }
061            };
062
063        TableColumn columnMonth = new TableColumn("Month");
064        columnMonth.setCellValueFactory(
065            new PropertyValueFactory<XYChart.Data,String>("XValue"));
066
067        TableColumn columnValue = new TableColumn("Value");
068        columnValue.setCellValueFactory(
069            new PropertyValueFactory<XYChart.Data,Number>("YValue"));
070
071        //--- Add for Editable Cell of Value field, in Number
072        columnValue.setCellFactory(cellFactory);
073
074        columnValue.setOnEditCommit(
075            new EventHandler<TableColumn.CellEditEvent<XYChart.Data, Number>>() {
076
077                @Override public void handle(TableColumn.CellEditEvent<XYChart.Data, Number> t) {
078                    ((XYChart.Data)t.getTableView().getItems().get(
079                            t.getTablePosition().getRow())).setYValue(t.getNewValue());
080                }
081            });
082
083        //--- Prepare StackedBarChart
084        final CategoryAxis xAxis = new CategoryAxis();
085        final NumberAxis yAxis = new NumberAxis();
086        xAxis.setLabel("Month");
087        xAxis.setCategories(FXCollections.<String> observableArrayList(Arrays.asList(
088                "January",
089                "February",
090                "March",
091                "April",
092                "May",
093                "June",
094                "July",
095                "August",
096                "September",
097                "October",
098                "November",
099                "December")));
100        yAxis.setLabel("Value");
101        final StackedBarChart<String,Number> stackedBarChart = new StackedBarChart<>(xAxis,yAxis);
102        stackedBarChart.setTitle("StackedBarChart");
103        XYChart.Series series1 = new XYChart.Series(dataList);
104        series1.setName("XYChart.Series 1");
105
106        //Series 2
107        XYChart.Series<String,Number> series2 = new XYChart.Series();
108        series2.setName("XYChart.Series 2");
109
110        series2.getData().add(new XYChart.Data("January", 150));
111        series2.getData().add(new XYChart.Data("February", 100));
112        series2.getData().add(new XYChart.Data("March", 60));
113        series2.getData().add(new XYChart.Data("April", 40));
114        series2.getData().add(new XYChart.Data("May", 30));
115        series2.getData().add(new XYChart.Data("June", 100));
116        series2.getData().add(new XYChart.Data("July", 100));
117        series2.getData().add(new XYChart.Data("August", 10));
118        series2.getData().add(new XYChart.Data("September", 175));
119        series2.getData().add(new XYChart.Data("October", 155));
120        series2.getData().add(new XYChart.Data("November", 125));
121        series2.getData().add(new XYChart.Data("December", 150));
122
123        stackedBarChart.getData().addAll(series1, series2);
124
125        //--- Prepare TableView
126        tableView.setItems(dataList);
127        tableView.getColumns().addAll(columnMonth, columnValue);
128
129        HBox hBox = new HBox();
130        hBox.setSpacing(10);
131        hBox.getChildren().addAll(tableView, stackedBarChart);
132
133        root.getChildren().add(hBox);
134
135        primaryStage.setScene(new Scene(root, 750, 400));
136        primaryStage.show();
137    }
138
139    class EditingCell extends TableCell<XYChart.Data, Number> {
140
141        private TextField textField;
142
143        public EditingCell() {}
144
145        @Override
146        public void startEdit() {
147
148            super.startEdit();
149
150            if (textField == null) {
151                createTextField();
152            }
153
154            setGraphic(textField);
155            setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
156            textField.selectAll();
157        }
158
159        @Override
160        public void cancelEdit() {
161            super.cancelEdit();
162
163            setText(String.valueOf(getItem()));
164            setContentDisplay(ContentDisplay.TEXT_ONLY);
165        }
166
167        @Override
168        public void updateItem(Number item, boolean empty) {
169            super.updateItem(item, empty);
170
171            if (empty) {
172                setText(null);
173                setGraphic(null);
174            } else {
175                if (isEditing()) {
176                    if (textField != null) {
177                        textField.setText(getString());
178                    }
179                    setGraphic(textField);
180                    setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
181                } else {
182                    setText(getString());
183                    setContentDisplay(ContentDisplay.TEXT_ONLY);
184                }
185            }
186        }
187
188        private void createTextField() {
189            textField = new TextField(getString());
190            textField.setMinWidth(this.getWidth() - this.getGraphicTextGap()*2);
191            textField.setOnKeyPressed(new EventHandler<KeyEvent>() {
192
193                @Override
194                public void handle(KeyEvent t) {
195                    if (t.getCode() == KeyCode.ENTER) {
196                        commitEdit(Double.parseDouble(textField.getText()));
197                    } else if (t.getCode() == KeyCode.ESCAPE) {
198                        cancelEdit();
199                    }
200                }
201            });
202        }
203
204        private String getString() {
205            return getItem() == null ? "" : getItem().toString();
206        }
207    }
208}