在datafx示例的帮助下,我写了一个简单的程序,在javafx中点击一个简单的按钮来填充tableView。我的代码如下
package testjavafx;
import java.net.URL;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ResourceBundle;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import org.datafx.reader.DataReader;
import org.datafx.reader.JdbcSource;
import org.datafx.reader.converter.JdbcConverter;
import org.datafx.provider.ListDataProvider;
public class SampleController {
@FXML
private ResourceBundle resources;
@FXML
private URL location;
@FXML
private TableColumn<Person, String> fNameCol;
@FXML
private TableColumn<Person, String> lNameCol;
@FXML
private TableView<Person> personTableView;
@FXML
private Button loadBtn;
ObservableList<Person> myList =
FXCollections.observableArrayList();;
@FXML
void handleLoadData(ActionEvent event) {
JdbcConverter<Person> converter = new JdbcConverter<Person>() {
@Override
public Person convertOneRow(ResultSet rs) {
Person answer = new Person();
try{
answer.setFirstName(rs.getString("FirstName"));
answer.setLastName(rs.getString("LastName"));
return answer;
} catch(SQLException ex){
System.out.println("Sql exception in conversion\n");
ex.printStackTrace();
}
return null;
}
};
DataReader<Person> dr = new JdbcSource<>("jdbc:mysql://localhost:3306/datafx?user=root&password=","select * from person;", converter);
//
// while(dr.next()){
// System.out.println(dr.get());
// }
//get the list now
ListDataProvider<Person> lodp = new ListDataProvider<>(dr);
//System.out.println(lodp.getData().size());
lodp.setResultObservableList(myList);
lodp.retrieve();
myList= lodp.getData();
// System.out.println(myList.get(0));
initializeTableView();
System.out.println(myList.size());
}
@FXML
void initialize() {
assert fNameCol != null : "fx:id=\"fNameCol\" was not injected: check your FXML file 'Sample.fxml'.";
assert lNameCol != null : "fx:id=\"lNameCol\" was not injected: check your FXML file 'Sample.fxml'.";
assert loadBtn != null : "fx:id=\"loadBtn\" was not injected: check your FXML file 'Sample.fxml'.";
}
private void initializeTableView() {
personTableView = new TableView<>(myList);
personTableView.setEditable(true);
fNameCol = new TableColumn<>("First Name");
fNameCol.setCellFactory(new PropertyValueFactory("firstName"));
lNameCol = new TableColumn<>("Last Name");
lNameCol.setCellValueFactory(new PropertyValueFactory("lastName"));
}
}
点击按钮,没有任何反应,控制台只显示“常规查询”。我检查了 DataReader 实例,它显示了数据库中的值,但未填充tableview。
使用StringProperty字段以及getter和setter,我的person类很简单。
坚持这个很长时间
答案 0 :(得分:4)
问题是你创建了一个新的TableView和新的TableColumns。这些不是在FXML文件中定义并在UI中显示的TableView和TableColumns。
我认为你需要
private void initializeTableView() {
personTableView.setItems(myList);
personTableView.setEditable(true);
// fNameCol = new TableColumn<>("First Name");
fNameCol.setCellFactory(new PropertyValueFactory("firstName"));
// lNameCol = new TableColumn<>("Last Name");
lNameCol.setCellValueFactory(new PropertyValueFactory("lastName"));
}
答案 1 :(得分:2)
James_D是对的,你不应该创建一个新的TableView实例,而应该使用@FXML Annotation提供的实例。 除此之外,你可以删除行
myList = lodp.getData();
myList变量已包含检索到的数据,因为您使用lodp.setResultObservableList(myList)传递了它;