如何将行和列添加到JavaFX 8 TableView
我在互联网上看到添加一行到TableView的例子,例如在Oracle文档中使用Person类。
但是我有一个可变数量的列,所以我不能绑定到一个Person(或任何其他)的bean业务对象。
Oracle示例继续展示如何将列绑定到属性名称,但为此,它只显示如何添加列,但不显示行。
我的问题是,有人可以指向一个dynamic添加任意列和/或行到JavaFX 8 TableView的Hello,World示例吗?
使用List<String>
(例如)作为数据types,并将单元格值工厂设置为索引到列表中的callback。
例如,这将创build一个由任意制表符分隔的文本文件构build的TableView<List<String>>
。 并非文件中的所有行都需要相同数量的元素(它将填充空格)。 (它不支持转义标签等):
public TableView<List<String>> readTabDelimitedFileIntoTable(Path file) throws IOException { TableView<List<String>> table = new TableView<>(); Files.lines(file).map(line -> line.split("\t")).forEach(values -> { // Add extra columns if necessary: for (int i = table.getColumns().size(); i < values.length; i++) { TableColumn<List<String>, String> col = new TableColumn<>("Column "+(i+1)); col.setMinWidth(80); final int colIndex = i ; col.setCellValueFactory(data -> { List<String> rowValues = data.getValue(); String cellValue ; if (colIndex < rowValues.size()) { cellValue = rowValues.get(colIndex); } else { cellValue = "" ; } return new ReadOnlyStringWrapper(cellValue); }); table.getColumns().add(col); } // add row: table.getItems().add(Arrays.asList(values)); }); return table ; }
那种笨重的,但是这个示例代码似乎工作:
TableView table = new TableView<>(); private char nextChar = 'A'; private void addColumn(TableView table) { String mapChar = String.valueOf(nextChar++); TableColumn<Map, String> column = new TableColumn<>("Class " + mapChar); column.setCellValueFactory(new MapValueFactory(mapChar)); column.setMinWidth(130); column.setCellFactory(cellFactoryForMap); table.getColumns().add(column); } private void addRow(TableView table) { ObservableList<Map> allData = table.getItems(); int offset = allData.size(); Map<String, String> dataRow = new HashMap<>(); for (int j = 0; j < table.getColumns().size(); j++) { String mapKey = Character.toString((char) ('A' + j)); String value1 = mapKey + (offset + 1); dataRow.put(mapKey, value1); } allData.add(dataRow); } }