Wypełnienie TableView danymi z bazy danych

0

Hej,
mam problem z umieszczeniem w tabeli danych z bazy danych Sqlite. Pisze aplikację w JavaFX, korzystam z Scene Buildera.
Przeczytałem już kilka tutoriali ale nic nie pomogło.
Po odpaleniu programu mam pusta tabelę. Są 3 kolumny, id, name, surname. W bazie mam wpisane 2 wiersze.
Będę wdzięczny za pomoc, bo już bardzo dużo czasu spędziłem nad tym kawałkiem.

 



/**
 *
 * @author Arif
 */
public class TeachersTableController implements Initializable
{

    @FXML
    TableColumn teacherIDCol;
    @FXML
    TableColumn nameCol;
    @FXML
    TableColumn surnameCol;
    @FXML
    TableView table;

    @Override
    public void initialize(URL location, ResourceBundle resources)
    {
        teacherIDCol.setCellValueFactory(new PropertyValueFactory<TeachersTableModel, String>("TeacherID"));
        nameCol.setCellValueFactory(new PropertyValueFactory<TeachersTableModel, String>("Name"));
        surnameCol.setCellValueFactory(new PropertyValueFactory<TeachersTableModel, String>("Surname"));

        buildData();
    }

    public void buildData()
    {
        Connection connection = null;

        try
        {
            connection = SqliteConnection.Connector();
            Statement statement = connection.createStatement();
            statement.setQueryTimeout(30);
            String query = "SELECT * FROM nauczyciele";
            ResultSet rs = statement.executeQuery(query);
            while(rs.next())
            {
                ObservableList<String> data = FXCollections.observableArrayList();
                for (int i = 1; i <= rs.getMetaData().getColumnCount(); i++)
                {
                    data.add(rs.getString(i));
                }
                table.getItems().setAll(data);
            }


        }catch(Exception e)
        {
            e.printStackTrace();
            System.out.println("Error on Building Data");
        }
    }
}

0

No więc od początku:
Po pierwsze primo:Zarówno TableView jak i TableColumn są typami generycznymi ipowinny zostać przez Ciebie uszczegółowione, to że SceneBuilder wygenerował Ci szablon kontrolera to jeszcze nie znaczy, że nie trzba go trochę poprawić. Nie wiem jakiej kolasy obiekty chcesz wyświetlać w tej tabeli, gdzies tam dalej widzę jakieś TeachersTableModel, którego nie byłeś łaska załączyć ale zgaduję, że to jest typ danych wyświetlanych w tabeli. Powinno więc być:

@FXML
TableColumn<TeacherTableModel, String> teacherIDCol;
@FXML
TableColumn<TeacherTableModel, String> nameCol;
@FXML
TableColumn<TeacherTableModel, String> surnameCol;
@FXML
TableView<TeacherTableModel> table;

Po drugie primo: Ten fragment: new PropertyValueFactory<TeachersTableModel, String>("TeacherID") zakłada, że w twojej klasie TeachersTableModel jest metodaTeacherIDProperty() (vide: https://docs.oracle.com/javase/8/javafx/api/javafx/scene/control/cell/PropertyValueFactory.html). Jeżeli nie ma to nie będzie to działać.

Po trzecie primo ultimo:

while(rs.next())
{
    ObservableList<String> data = FXCollections.observableArrayList();
    for (int i = 1; i <= rs.getMetaData().getColumnCount(); i++)
    {
        data.add(rs.getString(i));
    }
    table.getItems().setAll(data);
}

ten kod jest całkowicie pozbawiony sensu. Masz tablicę jakiegoś typu a jako model danych podajesz listę Stringów - w jaki automagiczny sposób ta tablica ma się renderować? W TableView każdy element na liście itemów służy do renderowania dokładnie jednego wiersza, w Twoim przypadku itemem jest Stringiem a z tego cieżko będzie trzy kolumny zrobić. Co gorsza metoda setAll(), której używasz w pętli powoduje każdorazowe wyczyszczenie listy i dodanie elementów - po każdej iteracji pętli while w liście masz dokładnie trzy Stringi a nie taki był chyba Twój zamiar. Metoda addAll() to raczej to czego szukasz.

Polecam zaopatrzyć się w jakąś dobrą ksiązkę do JavaFX a złożone komponenty typu TableView zostawić sobie na deser - do czasu solidnego opanowania ogólnej koncepcji jaka stoi za tą biblioteką. Większość tutoriali niestety prezentuje raczej mizerny poziom a losowe kopiowanie kawałków kodu z internetu z nadzieją, że to rozwiąże Twoj problem będzie jedynie źródłem frustracji i stratą czasu.
Powodzenia i pozdrawiam :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1