TableView(javaFX)仅显示空行

时间:2015-05-10 00:21:35

标签: java javafx javafx-2 tableview

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

项目链接 - > https://github.com/raphaelbgr/SwingSocketClient/tree/database

我正在尝试从数据库中收集信息并在此列表视图中显示,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;
}       

这称为上述方法:

public void populateHistoryTable(int rowLimit) {
    DAO dao = new DAO();
    try {
        dao.connect();
        table_chathistory.setItems(dao.queryChatHistory(rowLimit));
        dao.disconnect();
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

这是使用的DataModel,没有关于我遗漏的内容的想法:

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);
}
}

出现空白TableView,不知道我缺少什么

And a blank list View appears, no idea on what I am missing

2 个答案:

答案 0 :(得分:1)

您当前的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>

此处,tableColumns缺少cellValueFactory。在FXML中,您可以将其定义为

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

请注意,对于返回ObservableValue(上面的timestampProperty())的getter方法,应该具有propertyName +&#34; Property&#34;,其中propertyName是&#34; timestamp&#34;在<PropertyValueFactory property="timestamp" />

答案 1 :(得分:0)

我刚刚发现,在FXML文件中我必须输入它来关联要在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"><cellValueFactory><PropertyValueFactory property="timestamp" /></cellValueFactory></TableColumn>

<TableColumn prefWidth="85.0" text="Screen Name"><cellValueFactory><PropertyValueFactory property="screenname" /></cellValueFactory></TableColumn>

<TableColumn prefWidth="441.0" text="Message"><cellValueFactory><PropertyValueFactory property="message" /></cellValueFactory></TableColumn> </columns> `

并且必须对dataModel进行一些修改,以检索字符串值。

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);
}
}

我们走了,结果在这里: worked!