1

I am trying to populate a TableView from data in SQLite database but I am experiencing a very weird scenario that I cannot understand what is causing it.

The tableview only populates two columns and does not populate the rest. The Tablecolumns with 'NO' and 'Date Created' do not get populated when the TableView is finally displayed.

This code however displays data from SQLite database in 'Title' and 'Description' TableView columns.

Please someone with a hawk eye help me identify where I am going wrong on this code. I have spent the better part of the day trying to figure out where I am going wrong but I do not seem to figure out what it is that I am not doing it right. I will gladly appreciate any help on this.

Here is my code for

  1. Main class

Blockquote

public class Notedb extends Application {

    @Override
    public void start(Stage stage) throws Exception {
        Parent root = FXMLLoader.load(getClass().getResource("ListNotesUI.fxml"));

        Scene scene = new Scene(root);

        stage.setScene(scene);
        stage.show();
    }


    public static void main(String[] args) {
        launch(args);
    }

}

Blockquote

  1. FXML

Blockquote

<?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>

<SplitPane dividerPositions="0.5" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" orientation="VERTICAL" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="notedb.test.ListNotesUIController">
        <items>
            <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="100.0" prefWidth="160.0">
                <children>
                    <SplitPane dividerPositions="0.5" layoutX="186.0" layoutY="-2.0" orientation="VERTICAL" prefHeight="196.0" prefWidth="598.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
                        <items>
                            <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="100.0" prefWidth="160.0">
                                <children>
                                    <Button alignment="TOP_CENTER" contentDisplay="TEXT_ONLY" layoutX="484.0" layoutY="22.0" mnemonicParsing="false" onAction="#newNote" prefHeight="54.0" prefWidth="66.0" text="New Note" textAlignment="CENTER" wrapText="true" />
                                </children>
                            </AnchorPane>
                            <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="100.0" prefWidth="160.0">
                                <children>
                                    <GridPane layoutX="126.0" layoutY="2.0" prefHeight="94.0" prefWidth="596.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
                                        <columnConstraints>
                                            <ColumnConstraints hgrow="SOMETIMES" maxWidth="441.0" minWidth="10.0" prefWidth="441.0" />
                                            <ColumnConstraints hgrow="SOMETIMES" maxWidth="292.0" minWidth="10.0" prefWidth="155.0" />
                                        </columnConstraints>
                                        <rowConstraints>
                                            <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
                                        </rowConstraints>
                                        <children>
                                            <TextField fx:id="m_search" onAction="#searchNotes" />
                                            <Label fx:id="labelNOs" alignment="CENTER" prefHeight="17.0" prefWidth="94.0" text="4 Notes" GridPane.columnIndex="1" />
                                        </children>
                                    </GridPane>
                                </children>
                            </AnchorPane>
                        </items>
                    </SplitPane>
                </children>
            </AnchorPane>
            <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="100.0" prefWidth="160.0">
                <children>
                    <GridPane layoutX="181.0" layoutY="98.0" prefHeight="196.0" prefWidth="598.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
                        <columnConstraints>
                            <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
                        </columnConstraints>
                        <rowConstraints>
                            <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
                            <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
                        </rowConstraints>
                        <children>
                            <Pane prefHeight="200.0" prefWidth="200.0" GridPane.rowIndex="1">
                                <children>
                                    <Button layoutX="95.0" layoutY="24.0" mnemonicParsing="false" prefHeight="54.0" prefWidth="100.0" text="Delete" />
                                    <Button fx:id="btn_medit" layoutX="389.0" layoutY="24.0" mnemonicParsing="false" onAction="#editNoteRow" prefHeight="54.0" prefWidth="94.0" text="Edit" />
                                </children>
                            </Pane>
                            <TableView id="tableNotes" fx:id="tableNotes" editable="true" prefHeight="200.0" prefWidth="200.0">
                                <columns>
                                    <TableColumn id="noCol" fx:id="noCol" text="NO">
                                    </TableColumn>
                                    <TableColumn id="titleCol" fx:id="titleCol" text="Title">
                                    </TableColumn>
                                    <TableColumn id="dateCreatedCol" fx:id="dateCreatedCol" text="Date Created">
                                    </TableColumn>                                    
                                    <TableColumn id="descriptionCol" fx:id="descriptionCol" text="Description">
                                    </TableColumn>
                                </columns>
                            </TableView>
                        </children>
                    </GridPane>
                </children>
            </AnchorPane>
        </items>
    </SplitPane>

Blockquote

  1. Controller class

Blockquote

public class ListNotesUIController implements Initializable {


    @FXML
    private Label label;

    @FXML
    private Label labelNOs;

    @FXML
    private Button newNote;

    @FXML
    private Button btn_medit;    

    @FXML
    private TextField m_search;

    @FXML
    private TableView tableNotes;

    @FXML
    private TableColumn titleCol;

    @FXML
    private TableColumn descriptionCol;

    @FXML
    private TableColumn dateCreatedCol;

    @FXML
    private TableColumn noCol;

    //START | SQLITE
    private static Connection con;
    private static Statement stat;
    private PreparedStatement prep;
    //END | SQLITE

    private ObservableList <Note> dataNotes; 

    DataBank dbank = new DataBank();    

    @FXML
    private void handleButtonAction(ActionEvent event) {
        System.out.println("You clicked me!");
        label.setText("Hello World!");
    }

    @FXML
    private void editNoteRow(ActionEvent event) {

    }

    @FXML
    private void newNote(ActionEvent event) throws IOException {

    }


    @FXML
    private void searchNotes(ActionEvent event){

    }

    @Override
    public void initialize(URL url, ResourceBundle rb) {
        dataNotes = FXCollections.observableArrayList();

        noCol.setCellValueFactory(
                new PropertyValueFactory<Note, String>("idno")
        );
        dateCreatedCol.setCellValueFactory(
                new PropertyValueFactory<Note, String>("datecreated")
        );
        titleCol.setCellValueFactory(
                new PropertyValueFactory<Note, String>("title")
        );
        descriptionCol.setCellValueFactory(
                new PropertyValueFactory<Note, String>("description")
        );


        try {            
            SQLiteConfig config = new SQLiteConfig();
            con = DriverManager.getConnection("jdbc:sqlite:Note.db");
            stat = con.createStatement();
            stat.executeUpdate("CREATE TABLE IF NOT EXISTS NotesDB (idno INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, Title VARCHAR(500), Description VARCHAR(1000), DateCreated DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL);");

            ResultSet rs = con.createStatement().executeQuery("SELECT idno, Title, DateCreated, Description FROM NotesDB");
            while (rs.next()) {
                Note nt = new Note();
                nt.idno.set(rs.getString("idno"));
                nt.title.set(rs.getString("Title"));
                nt.datecreated.set(rs.getString("DateCreated"));
                nt.description.set(rs.getString("Description"));
                dataNotes.add(nt);                
            }            
            tableNotes.setItems(dataNotes);

        } catch (SQLException ex) {
            Logger.getLogger(ListNotesUIController.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

}

Blockquote

  1. DataModel class

Blockquote

public class Note {

    public  SimpleStringProperty title = new SimpleStringProperty();
    public  SimpleStringProperty description = new SimpleStringProperty();
    public  SimpleStringProperty datecreated = new SimpleStringProperty();
    public  SimpleStringProperty idno = new SimpleStringProperty();

    public String getTitle() {
        return title.get();
    }

    public void setTitle(String titleStr) {
        title.set(titleStr);
    }

    public String getDescription() {
        return description.get();
    }

    public void setDescription(String descriptionStr) {
        description.set(descriptionStr);
    }

    public String getDateCreated() {
        return datecreated.get();
    }

    public void setDateCreated(String datecreatedStr) {
        datecreated.set(datecreatedStr);
    }

    public String getIdNO() {
        return idno.get();
    }

    public void setIdNO(String idnoStr) {
        idno.set(idnoStr);
    }
}

Blockquote

1 Answer 1

1

There is a mistake regarding your property naming. Your function for getDateCreated and IdNO don't correlate with the naming convention.

Replace

public  SimpleStringProperty datecreated = new SimpleStringProperty();
public  SimpleStringProperty idno = new SimpleStringProperty();

with

public  SimpleStringProperty dateCreated = new SimpleStringProperty();
public  SimpleStringProperty idNO = new SimpleStringProperty();

And have a look at the naming conventions for properties

Sign up to request clarification or add additional context in comments.

1 Comment

Thank you so much @Inge for pinpointing that my naming conventions were the cause of the problem. I also changed the following; dateCreatedCol.setCellValueFactory( //new PropertyValueFactory<Note, String>("datecreated") //WRONG new PropertyValueFactory<Note, String>("dateCreated") //CORRECT ); and this other bit; noCol.setCellValueFactory( //new PropertyValueFactory<Note, String>("idno") //WRONG new PropertyValueFactory<Note, String>("idNO") //CORRECT ); and now it is working fine. Thank you

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.