TableView(javaFX)仅显示空行

TableView(javaFX)仅显示空行,java,javafx,javafx-2,tableview,Java,Javafx,Javafx 2,Tableview,我的TableView显示的是空行,我缺少什么 项目链接-> 我试图从数据库中收集信息,并在这个列表视图中显示它,jdbc连接是完美的,并且工作正常,但是tableView没有显示项目,我已经阅读了3次oracle教程,但是没有运气 public ObservableList<MessageDataTableModel> queryChatHistory(int rowLimit) throws SQLException { final ObservableList<M

我的
TableView
显示的是空行,我缺少什么

项目链接->

我试图从数据库中收集信息,并在这个列表视图中显示它,jdbc连接是完美的,并且工作正常,但是tableView没有显示项目,我已经阅读了3次oracle教程,但是没有运气

public ObservableList<MessageDataTableModel> queryChatHistory(int rowLimit) throws SQLException {
    final ObservableList<MessageDataTableModel> data = FXCollections.observableArrayList();
    String query = "SELECT SERV_REC_TIMESTAMP, OWNERNAME, TEXT FROM MESSAGELOG LIMIT " + rowLimit;

    Statement st = c.createStatement();
    ResultSet rs = st.executeQuery(query);
    while(rs.next()) {
        while(rs.next()) {
            data.add(new MessageDataTableModel(rs.getString(1),rs.getString(2),rs.getString(3)));
        }
    }
    return data;
}       
这是使用的数据模型,不知道我缺少什么:

private SimpleStringProperty timestamp = new SimpleStringProperty();
private SimpleStringProperty screenname = new SimpleStringProperty();
private SimpleStringProperty message = new SimpleStringProperty();

public MessageDataTableModel() {

}

public MessageDataTableModel(String timestamp, String screenname, String message) {
    this.timestamp = new SimpleStringProperty(timestamp);
    this.screenname = new SimpleStringProperty(screenname);
    this.message = new SimpleStringProperty(message);
}
public void setTimestamp(String timestamp) {
    this.timestamp.set(timestamp);
}
public void setScreenname(String screenname) {
    this.screenname.set(screenname);
}
public void setMessage(String message) {
    this.message.set(message);
}
}
然后出现一个空白的
表格视图
,不知道我缺少了什么


我刚刚发现,在FXML文件上,我必须输入这个来关联要在TableView上合并的数据



`

并且必须对数据模型进行一些修改,以检索字符串值

public class MessageDataTableModel {

private SimpleStringProperty timestamp = new SimpleStringProperty();
private SimpleStringProperty screenname = new SimpleStringProperty();
private SimpleStringProperty message = new SimpleStringProperty();

public MessageDataTableModel() {

}

public MessageDataTableModel(String timestamp, String screenname, String message) {
    this.timestamp = new SimpleStringProperty(timestamp);
    this.screenname = new SimpleStringProperty(screenname);
    this.message = new SimpleStringProperty(message);
}
public String getTimestamp() {
    return timestamp.getValue();
}
public void setTimestamp(String timestamp) {
    this.timestamp.set(timestamp);
}
public String getScreenname() {
    return screenname.getValue();
}
public void setScreenname(String screenname) {
    this.screenname.set(screenname);
}
public String getMessage() {
    return message.getValue();
}
public void setMessage(String message) {
    this.message.set(message);
}
}
现在,结果如下:

您当前的tableView定义如下:

<TableView fx:id="table_chathistory" layoutX="7.0" layoutY="31.0" prefHeight="354.0" prefWidth="602.0">
    <columns>
        <TableColumn prefWidth="75.0" text="Timestamp" />
        <TableColumn prefWidth="85.0" text="Screen Name" />
        <TableColumn prefWidth="441.0" text="Message" />
    </columns>
</TableView>

请注意,对于返回
ObservableValue
(上面的timestampProperty())的getter方法,应该具有propertyName+“Property”,其中propertyName是

中的“timestamp”,ListView由ListCells组成
ListCell
是用于呈现每行内容的抽象(它是
Cell
的子类)。我查看了您提供的代码,但没有看到任何类似ListCell工厂的内容。我还想补充一点,因为您希望显示包含多个字段(时间戳、屏幕名称、消息)的行,而不是每行中仅显示一个项目,所以您确实应该优先使用TableView而不是ListView。您在问题中向我们展示的GUI组件实际上似乎是一个TableView。这是一个
ListView
TableView
?显示定义tablecolumn.setCellValueFactory()的代码,如果存在tablecolumn.setCellFactory()。作为旁注,在每次setter调用上创建新的SimpleStringProperty是不好的。而是在类块中初始化它,然后执行以下操作:timestamp.set(timestamp);在setter方法中。
<TableView fx:id="table_chathistory" layoutX="7.0" layoutY="31.0" prefHeight="354.0" prefWidth="602.0">
    <columns>
        <TableColumn prefWidth="75.0" text="Timestamp" />
        <TableColumn prefWidth="85.0" text="Screen Name" />
        <TableColumn prefWidth="441.0" text="Message" />
    </columns>
</TableView>
<TableColumn prefWidth="75.0" text="Timestamp">
    <cellValueFactory>
        <PropertyValueFactory property="timestamp" />
    </cellValueFactory>
</TableColumn>
public class MessageDataTableModel
{

    private StringProperty timestampProperty = new SimpleStringProperty();

    public void setTimestamp( String timestamp ) {
        this.timestampProperty.set( timestamp );
    }

    public String getTimestamp() {
        return this.timestampProperty.get();
    }

    public StringProperty timestampProperty() {
        return this.timestampProperty;
    }
}