2015-05-10 3 views
0

my TableView Показывает пустые строки, что мне не хватает?TableView (javaFX) показывает только пустые строки

ссылка проекта ->https://github.com/raphaelbgr/SwingSocketClient/tree/database

Я пытаюсь собрать информацию из базы данных и показать его на этом списке, то соединение JDBC идеально подходит и работает, однако Tableview не отображает элементы, Я прочитал 3 раза учебник оракула, но не повезло.

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

+1

ListView состоит из ListCells. 'ListCell ' - это абстракция, которая используется для рендеринга содержимого в каждой из строк (это подкласс 'Cell '). Я просматриваю код, который вы предоставили, но я не вижу ничего похожего на фабрику ListCell. – scottb

+1

Я бы также добавил, что, поскольку вы хотите отображать строки, содержащие несколько полей (TimeStamp, Screen Name, Message), а не только один элемент в каждой строке, вам действительно нужно использовать TableView, предпочитая ListView. Компонент GUI, который вы показываете нам в своем вопросе, по-видимому, представляет собой TableView. – scottb

+1

Это «ListView» или «TableView»? –

ответ

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() в выше) должны иметь propertyName + "Свойство", где свойствоName является "timestamp" в <PropertyValueFactory property="timestamp" />.

+0

Большое вам спасибо, ты потрясающий! – raphaelbgr

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!

Смежные вопросы