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}