my TableView
Is showing blank lines, what am I missing?
我的TableView显示空白行,我错过了什么?
project link -> https://github.com/raphaelbgr/SwingSocketClient/tree/database
项目链接 - > https://github.com/raphaelbgr/SwingSocketClient/tree/database
I am trying to gather information from the database and show it on this list view, the jdbc connection is perfect and working, however the tableView is not displaying the items, I've read 3 times the oracle tutorial but no luck.
我正在尝试从数据库中收集信息并在此列表视图中显示,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;
}
And this calls the method above:
这称为上述方法:
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();
}
}
This is the DataModel used, no Idea on what I am missing on it:
这是使用的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);
}
}
And a blank TableView
appears, no idea on what I am missing
并且出现一个空白的TableView,不知道我错过了什么
2 个解决方案
#1
Your current tableView definition is as follows:
您当前的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>
Here, the tableColumns are missing the cellValueFactory. In FXML you can define it as
这里,tableColumns缺少cellValueFactory。在FXML中,您可以将其定义为
<TableColumn prefWidth="75.0" text="Timestamp">
<cellValueFactory>
<PropertyValueFactory property="timestamp" />
</cellValueFactory>
</TableColumn>
and the data model class should have the accessors:
并且数据模型类应该具有访问器:
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;
}
}
Note that for getter method that returns ObservableValue
(timestampProperty() in the above) should have the propertyName + "Property", where the propertyName is "timestamp" in <PropertyValueFactory property="timestamp" />
.
请注意,对于返回ObservableValue(上面的timestampProperty())的getter方法,应该具有propertyName +“Property”,其中propertyName是
#2
I just discovered, on the FXML file I had to input this to associate what data to incorporate on the TableView
我刚刚发现,在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>
`
And had to make a little modification on the dataModel, to retrieve the string values.
并且不得不对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);
}
}
And here we go, the results are here:
我们走了,结果在这里:
#1
Your current tableView definition is as follows:
您当前的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>
Here, the tableColumns are missing the cellValueFactory. In FXML you can define it as
这里,tableColumns缺少cellValueFactory。在FXML中,您可以将其定义为
<TableColumn prefWidth="75.0" text="Timestamp">
<cellValueFactory>
<PropertyValueFactory property="timestamp" />
</cellValueFactory>
</TableColumn>
and the data model class should have the accessors:
并且数据模型类应该具有访问器:
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;
}
}
Note that for getter method that returns ObservableValue
(timestampProperty() in the above) should have the propertyName + "Property", where the propertyName is "timestamp" in <PropertyValueFactory property="timestamp" />
.
请注意,对于返回ObservableValue(上面的timestampProperty())的getter方法,应该具有propertyName +“Property”,其中propertyName是
#2
I just discovered, on the FXML file I had to input this to associate what data to incorporate on the TableView
我刚刚发现,在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>
`
And had to make a little modification on the dataModel, to retrieve the string values.
并且不得不对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);
}
}
And here we go, the results are here:
我们走了,结果在这里: