首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >列表中的javafx表视图数据

列表中的javafx表视图数据
EN

Stack Overflow用户
提问于 2017-09-12 16:11:06
回答 1查看 11.5K关注 0票数 2

我对JavaFX中的TableView有问题。

从定义了所有字段的现有类创建表很容易。

但是我想知道是否有可能制作表格并从列表中添加数据?

我做了这样的东西,但它有点不起作用。

代码语言:javascript
复制
    @FXML
    private TableView<List<String>> testTable;

    ....


    List<String> list = new ArrayList<>();
    list.add("1hello");
    list.add("1hello2");

    List<String> list2 = new ArrayList<>();
    list2.add("2hello");
    list2.add("2hello2");

    ObservableList<List<String>> lists = FXCollections.observableArrayList();
    lists.add(list);
    lists.add(list2);

    TableColumn<List<String>, String> coll = new TableColumn<>("one");
    coll.setCellValueFactory(new PropertyValueFactory<List<String>,String>(""));
    TableColumn<List<String>, String> coll2 = new TableColumn<>("two");
    coll2.setCellValueFactory(new PropertyValueFactory<List<String>,String>(""));

    testTable.getColumns().add(coll);
    testTable.getColumns().add(coll2);

    lists.forEach(li -> {
        System.out.println("list: " +  li);
        testTable.getItems().add(li);

    }); 

它没有插入任何数据。这样的事情有可能发生吗?

EN

回答 1

Stack Overflow用户

发布于 2018-07-24 03:55:47

作为我工作的一小部分,我需要一个从列表中动态填充数据的TableView。我查看了StackOverflow中的其他一些示例,还查看了Oracle教程。但没有一种能满足我的需求。

为了满足我的需要,我把不同的解决方案弄得一团糟。请参阅下面的工作示例。

代码语言:javascript
复制
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<TableColumn> tableViewColumns = generateTableViewColumns();
        tableView.getColumns().setAll(tableViewColumns);

        ObservableList<TableColumn> tcs = tableView.getColumns();
        for (int i = 0; i < tcs.size(); i++) {
            TableColumn tc = tcs.get(i);

            if (i == 0) {
                Callback<TableColumn.CellDataFeatures<ArrayList, Color>, ObservableValue<Color>> cellValueFactory = buildCallbackColor(i);
                tc.setCellValueFactory(cellValueFactory);
            } else {
                Callback<TableColumn.CellDataFeatures<ArrayList, String>, ObservableValue<String>> cellValueFactory = buildCallbackString(i);
                tc.setCellValueFactory(cellValueFactory);
            }

        }

        ObservableList<ArrayList> tableViewRows = generateTableViewRows();
        tableView.getItems().setAll(tableViewRows);

        for (int i = 0; i < tcs.size(); i++) {
            TableColumn dataColumn = tcs.get(i);

            if (i == 0) {
                Callback<TableColumn<ArrayList, Color>, TableCell<ArrayList, Color>> cellFactoryPane = buildCallbackPane();
                dataColumn.setCellFactory(cellFactoryPane);
            } else {
                Callback<TableColumn<ArrayList, String>, TableCell<ArrayList, String>> 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<TableColumn> generateTableViewColumns() {
        ObservableList<TableColumn> 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<ArrayList> generateTableViewRows() {
        int max = 6;
        ObservableList<ArrayList> 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<TableColumn.CellDataFeatures<ArrayList, Color>, ObservableValue<Color>> buildCallbackColor(int index) {
        Callback<TableColumn.CellDataFeatures<ArrayList, Color>, ObservableValue<Color>> cellValueFactory = new Callback<TableColumn.CellDataFeatures<ArrayList, Color>, ObservableValue<Color>>() {
            @Override
            public ObservableValue<Color> call(TableColumn.CellDataFeatures<ArrayList, Color> param) {
                return new SimpleObjectProperty(param.getValue().get(index));
            }
        };
        return cellValueFactory;
    }

    private Callback<TableColumn.CellDataFeatures<ArrayList, String>, ObservableValue<String>> buildCallbackString(int index) {
        Callback<TableColumn.CellDataFeatures<ArrayList, String>, ObservableValue<String>> cellValueFactory = new Callback<TableColumn.CellDataFeatures<ArrayList, String>, ObservableValue<String>>() {
            @Override
            public ObservableValue<String> call(TableColumn.CellDataFeatures<ArrayList, String> param) {
                return new SimpleStringProperty((String) param.getValue().get(index));
            }
        };
        return cellValueFactory;
    }

    private Callback<TableColumn<ArrayList, Color>, TableCell<ArrayList, Color>> buildCallbackPane() {
        Callback<TableColumn<ArrayList, Color>, TableCell<ArrayList, Color>> cellFactory = new Callback<TableColumn<ArrayList, Color>, TableCell<ArrayList, Color>>() {
            @Override
            public TableCell call(TableColumn tableColumn) {
                double cellWidth = tableColumn.getMinWidth();
                double cellHeight = 35;

                TableCell tableCell = new TableCell<Object, Color>() {
                    @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<TableColumn<ArrayList, String>, TableCell<ArrayList, String>> buildCallbackTextFieldTableCell() {
        Callback<TableColumn<ArrayList, String>, TableCell<ArrayList, String>> cellFactory = new Callback<TableColumn<ArrayList, String>, TableCell<ArrayList, String>>() {
            @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;
    }

}

希望这篇文章能帮上忙,即使已经很晚了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46171183

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档