You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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截图

空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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 04:15:41