使用[datafx]中的JdbcSourceReader在TableView中加载数据

时间:2014-01-20 21:35:19

标签: java javafx javafx-2

在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类很简单。

坚持这个很长时间

2 个答案:

答案 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)传递了它;