使用二维数组填充表视图



我是Javafx的新手,想知道如何从字符串的二维数组填充表视图:

    String[][] staffArray = (String[][]) connection.getAll("StaffServices");
    ObservableList row = FXCollections.observableArrayList(staffArray);
    //don't know what should go in here
    staffTable.setItems(row);

真的很感激回应。

我认为JavaFX应该有一个只接受2d数组并制作表格的方法,但制作起来并不难。 诀窍是使用 CellValueFactory 为每列获取正确的数组索引,而不是获取 bean。 这类似于我使用的代码。

import java.util.Arrays;
import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.TableColumn.CellDataFeatures;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import javafx.util.Callback;
public class TableViewSample extends Application {
    @Override
    public void start(Stage primaryStage) {
        StackPane root = new StackPane();
        String[][] staffArray = {{"nice to ", "have", "titles"},
                                 {"a", "b", "c"},
                                 {"d", "e", "f"}};
        ObservableList<String[]> data = FXCollections.observableArrayList();
        data.addAll(Arrays.asList(staffArray));
        data.remove(0);//remove titles from data
        TableView<String[]> table = new TableView<>();
        for (int i = 0; i < staffArray[0].length; i++) {
            TableColumn tc = new TableColumn(staffArray[0][i]);
            final int colNo = i;
            tc.setCellValueFactory(new Callback<CellDataFeatures<String[], String>, ObservableValue<String>>() {
                @Override
                public ObservableValue<String> call(CellDataFeatures<String[], String> p) {
                    return new SimpleStringProperty((p.getValue()[colNo]));
                }
            });
            tc.setPrefWidth(90);
            table.getColumns().add(tc);
        }
        table.setItems(data);
        root.getChildren().add(table);
        primaryStage.setScene(new Scene(root, 300, 250));
        primaryStage.show();
    }
}

JavaFX 中TableView的最佳实践是使用具有属性的对象并将它们绑定到列。

我建议继续前进或将您的二维数组转换为更强类型的模型。

您的目标是拥有一个ObservableList<Model>,然后您可以将其分配给您的TableView

Oracle对TableView有一个非常好的介绍,展示了我建议的建议。

除了回答Brian之外,我还添加了适当的CellFactory,以避免使用toString()方法,当我们要查看具有良好设计的结果时。当您使用模型 - 视图 - 控制器模型时,我的解决方案是可以的。下面是控制器块的代码:

@FXML
private TableView<String[]> table = new TableView<>();
@FXML
public void initialize() {

    //binding our ObservableList with TableView
    String[][] staffArray = {{"a", "b", "c"},
                             {"d", "e", "f"}};
    ObservableList<String[]> data = FXCollections.observableArrayList();
    data.addAll(Arrays.asList(staffArray));
    for (int i = 0; i < data.get(0).length; i++) {
        TableColumn tc = new TableColumn();
        tc.setSortable(false);

        final int colNo = i;
        tc.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<String[], String>, ObservableValue<String>>() {
            @Override
            public ObservableValue<String> call(TableColumn.CellDataFeatures<String[], String> p) {
                return new SimpleStringProperty((p.getValue()[colNo]));
            }
        });
        tc.setCellFactory(col -> {
            TableCell<String[], String> cell = new TableCell<>();
            cell.itemProperty().addListener((observableValue, o, newValue) -> {
                if (newValue != null) {
                    Node graphic = createPriorityGraphic(newValue);
                    cell.graphicProperty().bind(Bindings.when(cell.emptyProperty()).then((Node) null).otherwise(graphic));
                }
            });
            return cell;
        });
        table.getColumns().add(tc);
    }

    // making Headers of table hidden
    table.widthProperty().addListener(new ChangeListener<Number>() {
        @Override
        public void changed(ObservableValue<? extends Number> ov, Number t, Number t1) {
            // Get the table header
            Pane header = (Pane) table.lookup("TableHeaderRow");
            if (header != null && header.isVisible()) {
                header.setMaxHeight(0);
                header.setMinHeight(0);
                header.setPrefHeight(0);
                header.setVisible(false);
                header.setManaged(false);
            }
        }
    });
    table.setItems(data);
    table.setSelectionModel(null);
    table.setMaxSize(315.0, 502.0);
}
//prepare some special design for tableview output, if needed
@FXML
private Node createPriorityGraphic(String value) {
    if (!value.equals("0") && value != "") {
        Rectangle graphic = new Rectangle();
        graphic.setHeight(25);
        graphic.setWidth(25);
        graphic.setOpacity(80);
        return graphic;
    }
    return null;
}

最新更新