我是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;
}