I am creating a JavaFX program and have started to use FXML for the layout. Now that I have implemented an FXML file with the layout I want, the piece of code below is no longer working to set the values in the table columns. Not sure where I'm going wrong here. This is the beginning of my controller class below.
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
public class Controller {
@FXML public TableView<Student> studentTable;
ObservableList<Student> studentArray = FXCollections.observableArrayList();
//First Name Column
TableColumn<Student,String> firstNameColumn = new TableColumn<>("First Name");
firstNameColumn.setMinWidth(50);
firstNameColumn.setCellValueFactory(new PropertyValueFactory<>("firstName"));
//Last Name Column
TableColumn<Student,String> lastNameColumn = new TableColumn<>("Last Name");
lastNameColumn.setMinWidth(50);
lastNameColumn.setCellValueFactory(new PropertyValueFactory<>("lastName"));
//Major Column
TableColumn<Student,String> majorColumn = new TableColumn<>("Major");
majorColumn.setMinWidth(50);
majorColumn.setCellValueFactory(new PropertyValueFactory<>("major"));
//GPA Column
TableColumn<Student,Double> gpaColumn = new TableColumn<>("GPA");
gpaColumn.setMinWidth(20);
gpaColumn.setCellValueFactory(new PropertyValueFactory<>("gpa"));
//UIN Column
TableColumn<Student,Integer> uinColumn = new TableColumn<>("UIN");
uinColumn.setMinWidth(30);
uinColumn.setCellValueFactory(new PropertyValueFactory<>("uin"));
//Net ID Column
TableColumn<Student,Integer> netIDColumn = new TableColumn<>("Net ID");
netIDColumn.setMinWidth(15);
netIDColumn.setCellValueFactory(new PropertyValueFactory<>("netID"));
//Age Column
TableColumn<Student,Integer> ageColumn = new TableColumn<>("Age");
ageColumn.setMinWidth(20);
ageColumn.setCellValueFactory(new PropertyValueFactory<>("age"));
//Gender Column
TableColumn<Student,String> genderColumn = new TableColumn<>("Gender");
genderColumn.setMinWidth(50);
genderColumn.setCellValueFactory(new PropertyValueFactory<>("gender"));
studentTable.setItems(studentArray);
studentTable.getColumns().addAll(firstNameColumn, lastNameColumn, majorColumn, gpaColumn,uinColumn, netIDColumn, ageColumn, genderColumn);
public void deleteStudent() {
Student selectedStudent = studentTable.getSelectionModel().getSelectedItem();
My Main class
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
public class Lab8 extends Application {
public static void main(String[]args){
launch(args);
}
@Override
public void start(Stage primaryStage) throws Exception {
Parent root = FXMLLoader.load(getClass().getResource("Lab8Layout.fxml"));
primaryStage.setTitle("Student Interface");
primaryStage.setScene(new Scene(root, 700,700));
primaryStage.show();
}
}
Student class
public class Student {
private String firstName;
private String lastName;
private String major;
private double gpa;
private int uin;
private int netID = 0;
private int age;
private String gender;
public static int counter = 1;
public Student(String newFirstName, String newLastName, String newMajor, double newGpa, int newUin, int newAge, String newGender){
firstName = newFirstName;
lastName = newLastName;
setMajor(newMajor);
setGpa(newGpa);
setUin(newUin);
setAge(newAge);
setGender(newGender);
netID = counter++;
}
public Student(String newFirstName, String newLastName, int newNetID, String newMajor, double newGpa, int newUin, int newAge, String newGender){
firstName = newFirstName;
lastName = newLastName;
setMajor(newMajor);
setGpa(newGpa);
setUin(newUin);
netID = newNetID;
setAge(newAge);
setGender(newGender);
this.netID = counter++;
}
public String getFirstName(){
return firstName;
}
public String getLastName(){
return lastName;
}
public int getID(){
return netID;
}
public String getMajor() {
return major;
}
public void setMajor(String major) {
this.major = major;
}
public double getGpa() {
return gpa;
}
public void setGpa(double gpa) {
this.gpa = gpa;
}
public int getUin() {
return uin;
}
public void setUin(int uin) {
this.uin = uin;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {this.gender = gender; }
}
FXML File
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import javafx.geometry.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="Controller">
<top>
<VBox BorderPane.alignment="CENTER">
<children>
<MenuBar>
<menus>
<Menu mnemonicParsing="false" text="File">
<items>
<MenuItem mnemonicParsing="false" text="Save" />
<MenuItem mnemonicParsing="false" text="Load Students" />
</items>
</Menu>
<Menu mnemonicParsing="false" text="Edit">
<items>
<MenuItem mnemonicParsing="false" text="Delete" />
</items>
</Menu>
<Menu mnemonicParsing="false" text="Help">
<items>
<MenuItem mnemonicParsing="false" text="About" />
</items>
</Menu>
</menus>
</MenuBar>
<HBox prefHeight="0.0" prefWidth="595.0">
<children>
<TextField minWidth="80.0" promptText="First Name">
<padding>
<Insets bottom="3.0" left="3.0" right="3.0" top="3.0" />
</padding>
<HBox.margin>
<Insets bottom="3.0" left="3.0" right="3.0" top="3.0" />
</HBox.margin>
</TextField>
<TextField minWidth="80.0" promptText="Last Name">
<padding>
<Insets bottom="3.0" left="3.0" right="3.0" top="3.0" />
</padding>
<opaqueInsets>
<Insets bottom="3.0" left="3.0" right="3.0" top="3.0" />
</opaqueInsets>
<HBox.margin>
<Insets bottom="3.0" left="3.0" right="3.0" top="3.0" />
</HBox.margin>
</TextField>
<TextField minWidth="80.0" promptText="Major">
<padding>
<Insets bottom="3.0" left="3.0" right="3.0" top="3.0" />
</padding>
<HBox.margin>
<Insets bottom="3.0" left="3.0" right="3.0" top="3.0" />
</HBox.margin>
</TextField>
<TextField minWidth="20.0" promptText="GPA">
<padding>
<Insets bottom="3.0" left="3.0" right="3.0" top="3.0" />
</padding>
<HBox.margin>
<Insets bottom="3.0" left="3.0" right="3.0" top="3.0" />
</HBox.margin>
</TextField>
<TextField promptText="UIN">
<HBox.margin>
<Insets bottom="3.0" left="3.0" right="3.0" top="3.0" />
</HBox.margin>
<padding>
<Insets bottom="3.0" left="3.0" right="3.0" top="3.0" />
</padding>
</TextField>
<TextField minWidth="20.0" promptText="Age">
<padding>
<Insets bottom="3.0" left="3.0" right="3.0" top="3.0" />
</padding>
<HBox.margin>
<Insets bottom="3.0" left="3.0" right="3.0" top="3.0" />
</HBox.margin>
</TextField>
<TextField minWidth="30.0" promptText="Gender">
<padding>
<Insets bottom="3.0" left="3.0" right="3.0" top="3.0" />
</padding>
<HBox.margin>
<Insets bottom="3.0" left="3.0" right="3.0" top="3.0" />
</HBox.margin>
</TextField>
<Pane prefHeight="29.0" prefWidth="97.0" HBox.hgrow="ALWAYS" />
<Button minWidth="85.0" mnemonicParsing="false" text="Add Student" HBox.hgrow="ALWAYS" />
</children>
<padding>
<Insets bottom="3.0" left="3.0" right="3.0" top="3.0" />
</padding>
<VBox.margin>
<Insets bottom="3.0" left="3.0" right="10.0" top="3.0" />
</VBox.margin>
</HBox>
</children>
</VBox>
</top>
<center>
<TableView id="studentTable" fx:id="studentTable" prefHeight="200.0" prefWidth="200.0" BorderPane.alignment="CENTER">
<columns>
<TableColumn prefWidth="75.0" text="C1" />
<TableColumn prefWidth="75.0" text="C2" />
</columns>
</TableView>
</center>
<bottom>
<VBox BorderPane.alignment="CENTER">
<children>
<HBox spacing="5.0">
<children>
<Button id="deleteButton" mnemonicParsing="false" onAction="#deleteStudent" text="Delete Student" />
</children>
<padding>
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
</padding>
</HBox>
<TextField editable="false" text="Status Bar" />
</children>
</VBox>
</bottom>
</BorderPane>