Populating a TableView with data from Database JavaFX


Question

I'm trying to populate my TableView in JavaFX with data from my database. I've been trying a lot of different methods to try and get something working. I've been changing a lot of things but ultimately I haven't gotten anywhere. I think it has something to do with the way I'm loading my FXML file.

My database has 3 columns, so I'm not sure if I have to define everything from the database in my Artist class and that's why it's giving me errors.

I built my GUI with SceneBuilder so I'll attach my FXML file.

My main class

package application;
import java.io.IOException;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.paint.Color;


public class Main extends Application {
@Override
public void start(Stage stage) throws IOException {
    FXMLLoader loader = new FXMLLoader(Main.class
            .getResource("artistSelection.fxml"));
        Group rootGroup = loader.load();

    final artistSelectionController controller = loader.getController();
    controller.setStage(stage);  
    Scene scene = new Scene(rootGroup,600,400);
    stage.setScene(scene);
    StageStyle stageStyle = StageStyle.TRANSPARENT;
    scene.setFill(Color.TRANSPARENT);
    stage.initStyle(stageStyle);
    stage.show();
}

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

My Controller Class

public class artistSelectionController{

@FXML
private Rectangle rect;

@FXML
private ImageView logo;

@FXML
private HBox buttons;

@FXML
private Button newArtist;

@FXML
private Button closeScreen;

private Stage stage;
private double dragAnchorX;
private double dragAnchorY;

private PreparedStatement preparedStatement;

public void setStage(Stage stage){
    this.stage = stage;
}

@FXML
public void closeScreenHandler(ActionEvent e){
    stage.close();
}

@FXML
public void mousePressedHandler(MouseEvent me) {
    dragAnchorX = me.getScreenX() - stage.getX();
    dragAnchorY = me.getScreenY() - stage.getY();
    }

@FXML
public void mouseDraggedHandler(MouseEvent me) {
    stage.setX(me.getScreenX() - dragAnchorX);
    stage.setY(me.getScreenY() - dragAnchorY);
    }

@FXML
private static TableView<Artist> artistTable;

@FXML
private TableColumn<Artist, String> artistName;

private DBConnect objDbClass;

private Connection con;

private Logger logger;

@FXML
void initialize(){
    // assert artistTable != null : "fx:id=\"tableview\" was not injected: check your FXML file 'UserMaster.fxml'.";
     artistName.setCellValueFactory(
        new PropertyValueFactory<Artist,String>("Artist"));        

    objDbClass = new DBConnect();
    try{
        con = objDbClass.getConnection();
        buildData();
    }
    catch(ClassNotFoundException ce){
        logger.newInput(ce.toString());
    }
    catch(SQLException ce){
        logger.newInput(ce.toString());
    }
}

private ObservableList<Artist> data;

public void buildData(){        
    data = FXCollections.observableArrayList();
    try{      
        String SQL = "Select Name from ARTIST";            
        ResultSet rs = con.createStatement().executeQuery(SQL);  
        while(rs.next()){
            Artist cm = new Artist();                     

            cm.name.set(rs.getString("name"));

            data.add(cm);                  
        }
        artistTable.setItems(data);
    }
    catch(Exception e){
          e.printStackTrace();
          System.out.println("Error on Building Data");            
    }
}


}

My POJO

package application;
import javafx.beans.property.SimpleStringProperty;

public class Artist {

public SimpleStringProperty name =  new SimpleStringProperty();
public SimpleStringProperty genre = new SimpleStringProperty();

public String getName() {
    return name.get();
}

public String getGenre() {
    return genre.get();
}   
}

My Database Connector

import java.sql.*;

public class DBConnect{    
public Connection getConnection() throws ClassNotFoundException, SQLException{       
      Class.forName("com.mysql.jdbc.Driver");
      return DriverManager.getConnection("jdbc:mysql://localhost/myStudio","root","root"); 
    }
}

And finally my FXML file

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

<?import javafx.scene.control.*?>
<?import javafx.scene.*?>
<?import javafx.scene.image.*?>
<?import javafx.scene.paint.*?>
<?import javafx.scene.shape.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.layout.BorderPane?>

<Group fx:id="rootGroup" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application/artistSelectionController">
<children>
  <Rectangle fx:id="rect" arcHeight="50.0" arcWidth="50.0" height="376.0" layoutX="13.0" layoutY="13.0" stroke="BLACK" strokeType="INSIDE" width="577.0">
     <fill>
        <LinearGradient cycleMethod="REPEAT" endX="1.0" endY="1.0" startY="1.0">
           <stops>
              <Stop color="#1b2f36" />
              <Stop color="#1b2f36" offset="0.007662835249042145" />
              <Stop color="#15596e" offset="1.0" />
           </stops>
        </LinearGradient>
     </fill>
  </Rectangle>
  <ImageView fx:id="logo" fitHeight="411.0" fitWidth="606.0" layoutX="13.0" layoutY="13.0" pickOnBounds="true" preserveRatio="true">
     <image>
        <Image url="@../../../../Downloads/myStudio.png" />
     </image>
  </ImageView>
  <TableView fx:id="artistTable" layoutX="316.0" layoutY="143.0" prefHeight="223.0" prefWidth="241.0">
     <columns>
        <TableColumn fx:id="artistName" editable="false" prefWidth="240.0" resizable="false" text="Artists" />
     </columns>
  </TableView>
  <HBox fx:id="buttons" layoutX="65.0" layoutY="339.0" prefHeight="100.0" prefWidth="200.0" spacing="20.0">
     <children>
        <Button fx:id="newArtist" mnemonicParsing="false" prefWidth="75.0" text="New Artist" />
        <Button fx:id="closeScreen" mnemonicParsing="false" prefWidth="75.0" text="Close" />
     </children>
  </HBox>
</children>
</Group>

Thanks

1
0
11/17/2014 7:15:41 PM

Accepted Answer

There seem to be many errors in your code.

First, you have made artistTable static. Don't do this - it makes no sense at all, and static fields won't be injected by the FXMLLoader. This is why you are getting the null pointer exception.

Second, the value you pass to the PropertyValueFactory ("Artist") does not match the name of any property in your model class Artist. (I.e. there is no ArtistProperty() method and no getArtist() method).

You probably want

artistName.setCellValueFactory(
        new PropertyValueFactory<Artist,String>("name"));

which will tie the value for the column to the getName() method. See the PropertyValueFactory documentation for a description of how it works.

(You should probably define your POJO according to the JavaFX Property pattern described here. However just having a get...() method will work.)

0
11/17/2014 8:06:38 PM

Licensed under: CC-BY-SA with attribution
Not affiliated with: Stack Overflow
Icon