JavaFX TableView无法显示数据问题求助
问题描述
我查过很多相关问题,但现有答案都解决不了我的问题。我有一个包含4列的TableView,数据来自TXT文件。在Controller的initialize方法中设置了CellValueFactory,调用方法从文件读取数据并创建模型的ObservableList,之后把列表设为TableView的items,但数据完全不显示,连占位符都没有,求问问题出在哪?
Controller类
@FXML private TableView<Data> dataTable; @FXML private TableColumn<Data, String> dataType; @FXML private TableColumn<Data, String> dataName; @FXML private TableColumn<Data, String> dataDate; @FXML private TableColumn<Data, String> dataInformation; @FXML public void initialize() { dataType.setCellValueFactory(value -> new SimpleStringProperty(value.getValue().getDataType())); dataName.setCellValueFactory(value -> new SimpleStringProperty(value.getValue().getDataName())); dataDate.setCellValueFactory(value -> new SimpleStringProperty(value.getValue().getDataDate())); dataInformation.setCellValueFactory(value -> new SimpleStringProperty(value.getValue().getDataInformation())); initData(); } private void initData() { ArrayList<Data> data = new ArrayList<>(); try { Path filePath = Paths.get("src/main/resources/kl/fla/decrypted.txt"); if (filePath.toFile().exists()) { data = (ArrayList<Data>) Files.readAllLines(filePath, StandardCharsets.UTF_8).stream() .map(Data::new).collect(Collectors.toList()); } } catch (Exception e) { e.printStackTrace(); } dataTable.setItems(FXCollections.observableArrayList(data)); dataTable.refresh(); }
FXML文件
<Pane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="720.0" prefWidth="1080.0" xmlns="http://javafx.com/javafx/18" xmlns:fx="http://javafx.com/fxml/1" fx:controller="kl.fla.controller.TableController" > <children> <Label alignment="CENTER" layoutX="393.0" layoutY="34.0" prefHeight="70.0" prefWidth="295.0" text="Hidden Gate"> <font> <Font size="48.0" /> </font> </Label> <TableView fx:id="dataTable" fixedCellSize="1.0" layoutX="36.0" layoutY="141.0" prefHeight="439.0" prefWidth="840.0"> <columns> <TableColumn fx:id="dataType" prefWidth="135.0" resizable="false" text="Datatype" /> <TableColumn fx:id="dataName" minWidth="4.0" prefWidth="135.0" resizable="false" text="Name" /> <TableColumn fx:id="dataDate" prefWidth="135.0" resizable="false" text="Date" /> <TableColumn fx:id="dataInformation" minWidth="0.0" prefWidth="285.0" resizable="false" text="Information" /> </columns> </TableView> </children> </Pane>
空TableView截图

排查与解决方法
1. 修复单元格高度问题
你给TableView设置了fixedCellSize="1.0",这会让每行单元格高度仅为1像素,肉眼完全看不到内容。直接删除这个属性,或者设置合理的高度值(比如24.0):
<TableView fx:id="dataTable" layoutX="36.0" layoutY="141.0" prefHeight="439.0" prefWidth="840.0">
2. 确保文件读取正常
- 路径问题:运行时
src/main/resources会被打包到classpath根目录,用类加载器获取路径更可靠,避免路径错误:private void initData() { ArrayList<Data> data = new ArrayList<>(); try { URL resource = getClass().getResource("/kl/fla/decrypted.txt"); if (resource != null) { Path filePath = Paths.get(resource.toURI()); data = (ArrayList<Data>) Files.readAllLines(filePath, StandardCharsets.UTF_8).stream() .map(Data::new).collect(Collectors.toList()); System.out.println("读取到数据条数:" + data.size()); // 验证是否读到数据 } else { System.out.println("文件不存在或路径错误"); } } catch (Exception e) { e.printStackTrace(); } dataTable.setItems(FXCollections.observableArrayList(data)); } - 打印
data.size()确认是否读取到数据,如果输出0,说明文件为空或读取逻辑有问题。
3. 验证Data类的正确性
- 确保
Data类的构造函数能正确解析每行文本,比如按分隔符拆分字符串并赋值给对应属性。 - 确认
getDataType()、getDataName()等getter方法返回的不是null,且是预期的字符串内容。
4. 移除不必要的refresh()调用
dataTable.setItems()会自动触发TableView更新,不需要额外调用dataTable.refresh(),可以直接删掉这行代码。
内容的提问来源于stack exchange,提问作者spinnning
相关产品推荐
相关产品推荐

