javafx tableview data from List

后端 未结 2 609
情话喂你
情话喂你 2020-12-21 11:59

I\'ve got problem with TableView in JavaFX.

Creating tables from existing class with all fields defined is easy.

But I\'m wondering if it is possible to make

2条回答
  •  死守一世寂寞
    2020-12-21 12:39

    As a little piece for my work i need a TableView with dynamically filled data from a List. I looked at some other samples out there in StackOverflow and also at the Oracle tutorials. But nothing fits my needs.

    To meet my necessity i puzzled the different solutions together. See the working sample below.

    import java.util.ArrayList;
    import javafx.util.Callback;
    import javafx.util.StringConverter;
    import javafx.collections.FXCollections;
    import javafx.collections.ObservableList;
    import javafx.geometry.Insets;
    import javafx.scene.paint.Color;
    import javafx.scene.text.Font;
    import javafx.scene.Group;
    import javafx.scene.Scene;
    import javafx.scene.canvas.Canvas;
    import javafx.scene.canvas.GraphicsContext;
    import javafx.scene.control.Label;
    import javafx.scene.control.TableCell;
    import javafx.scene.control.TableColumn;
    import javafx.scene.control.TableView;
    import javafx.scene.control.cell.TextFieldTableCell;
    import javafx.beans.property.SimpleObjectProperty;
    import javafx.beans.property.SimpleStringProperty;
    import javafx.beans.value.ObservableValue;
    import javafx.scene.layout.Pane;
    import javafx.scene.layout.VBox;
    import javafx.stage.Stage;
    import javafx.application.Application;
    
    /**
     *
     * @author Rob
     */
    public class TableViewSample extends Application {
    
        public static void main(String[] args) {
            launch(args);
        }
    
        @Override
        public void start(Stage stage) {
            Scene scene = new Scene(new Group());
            stage.setTitle("Table View Sample");
            stage.setWidth(400);
            stage.setHeight(500);
    
            final Label label = new Label("Student IDs");
            label.setFont(new Font("Arial", 20));
    
            TableView tableView = new TableView<>();
            tableView.setEditable(true);
            tableView.getSelectionModel().setCellSelectionEnabled(true);
    
            ObservableList tableViewColumns = generateTableViewColumns();
            tableView.getColumns().setAll(tableViewColumns);
    
            ObservableList tcs = tableView.getColumns();
            for (int i = 0; i < tcs.size(); i++) {
                TableColumn tc = tcs.get(i);
    
                if (i == 0) {
                    Callback, ObservableValue> cellValueFactory = buildCallbackColor(i);
                    tc.setCellValueFactory(cellValueFactory);
                } else {
                    Callback, ObservableValue> cellValueFactory = buildCallbackString(i);
                    tc.setCellValueFactory(cellValueFactory);
                }
    
            }
    
            ObservableList tableViewRows = generateTableViewRows();
            tableView.getItems().setAll(tableViewRows);
    
            for (int i = 0; i < tcs.size(); i++) {
                TableColumn dataColumn = tcs.get(i);
    
                if (i == 0) {
                    Callback, TableCell> cellFactoryPane = buildCallbackPane();
                    dataColumn.setCellFactory(cellFactoryPane);
                } else {
                    Callback, TableCell> cellFactoryTextFieldTableCell = buildCallbackTextFieldTableCell();
                    dataColumn.setCellFactory(cellFactoryTextFieldTableCell);
                }
    
            }
    
            final VBox vbox = new VBox();
    
            vbox.setSpacing(5);
            vbox.setPadding(new Insets(10, 0, 0, 10));
            vbox.getChildren().addAll(label, tableView);
    
            ((Group) scene.getRoot()).getChildren().addAll(vbox);
    
            stage.setScene(scene);
    
            stage.show();
        }
    
        private ObservableList generateTableViewColumns() {
            ObservableList tableViewColumns = FXCollections.observableArrayList();
            TableColumn firstDataColumn = new TableColumn<>("Activity");
            TableColumn secondDataColumn = new TableColumn<>("Class A");
            TableColumn thirdDataColumn = new TableColumn<>("Class B");
    
            firstDataColumn.setMinWidth(80);
            secondDataColumn.setMinWidth(130);
            thirdDataColumn.setMinWidth(130);
    
            tableViewColumns.add(firstDataColumn);
            tableViewColumns.add(secondDataColumn);
            tableViewColumns.add(thirdDataColumn);        
    
            return tableViewColumns;
        }
    
        private ObservableList generateTableViewRows() {
            int max = 6;
            ObservableList tableViewRows = FXCollections.observableArrayList();
            for (int i = 1; i < max; i++) {
                ArrayList dataRow = new ArrayList<>();
    
                Color value1 = Color.GREEN;
                String value2 = "A" + i;
                String value3 = "B" + i;
    
                dataRow.add(value1);
                dataRow.add(value2);
                dataRow.add(value3);
    
                tableViewRows.add(dataRow);
            }
            return tableViewRows;
        }
    
        private Callback, ObservableValue> buildCallbackColor(int index) {
            Callback, ObservableValue> cellValueFactory = new Callback, ObservableValue>() {
                @Override
                public ObservableValue call(TableColumn.CellDataFeatures param) {
                    return new SimpleObjectProperty(param.getValue().get(index));
                }
            };
            return cellValueFactory;
        }
    
        private Callback, ObservableValue> buildCallbackString(int index) {
            Callback, ObservableValue> cellValueFactory = new Callback, ObservableValue>() {
                @Override
                public ObservableValue call(TableColumn.CellDataFeatures param) {
                    return new SimpleStringProperty((String) param.getValue().get(index));
                }
            };
            return cellValueFactory;
        }
    
        private Callback, TableCell> buildCallbackPane() {
            Callback, TableCell> cellFactory = new Callback, TableCell>() {
                @Override
                public TableCell call(TableColumn tableColumn) {
                    double cellWidth = tableColumn.getMinWidth();
                    double cellHeight = 35;
    
                    TableCell tableCell = new TableCell() {
                        @Override
                        protected void updateItem(Color item, boolean empty) {
                            super.updateItem(item, empty);
    
                            if (empty) {
                                setText(null);
                                setGraphic(null);
                            } else {
                                Pane p = new Pane();
                                p.setPrefSize(cellWidth, cellHeight);
                                Canvas canvasRectLayerColor = new Canvas();
                                p.getChildren().add(canvasRectLayerColor);
                                canvasRectLayerColor.setWidth(20);
                                canvasRectLayerColor.setHeight(20);
                                GraphicsContext gc = canvasRectLayerColor.getGraphicsContext2D();      
                                gc.setFill(item);
                                gc.fillRect(0, 0, canvasRectLayerColor.getWidth(), canvasRectLayerColor.getHeight());
                                setGraphic(p);
                            }
                        }
                    };
    
                    return tableCell;
                }
            };
    
            return cellFactory;
        }
    
        private Callback, TableCell> buildCallbackTextFieldTableCell() {
            Callback, TableCell> cellFactory = new Callback, TableCell>() {
                @Override
                public TableCell call(TableColumn tc) {
                    TextFieldTableCell tftc = new TextFieldTableCell(new StringConverter() {
                        @Override
                        public String toString(Object t) {
                            return t.toString();
                        }
    
                        @Override
                        public Object fromString(String string) {
                            return string;
                        }
                    });
    
                    return tftc;
                }
            };
            return cellFactory;
        }
    
    }
    

    Hope this one help even it is quite late.

提交回复
热议问题