I'm working on a larger project (together with quite a number of fellow students), and I'm trying to display an arrayList (which type we're using over and over again in our project, so I wouldn't love to change all these to ObservableLists just for my rather small issue) in a TableView.
I've created a smaller project just in order to get to the heart of the problem and to show you:
In the class editMyGrades (together with an fxml file of the same name) I want to display my SUBJECTs (-> String subjectName), each one with its GRADE (-> int grade) in a TableView.
Initializing the parent root and the tableView the ArrayList subjects is transformed to an ObservableList, which is loaded into the TableView.
I really would like to understand theoretically, why changing GRADEs works with the tableView, but removing doesn't, and to know what to do about it practically ;-)
Thank you very much in advance!
Main class:
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
import java.util.ArrayList;
public class Main extends Application {
    private static ArrayList<Subject> subjects = new ArrayList<>();
    public static ArrayList<Subject> getSubjects () {return subjects;}
//    private static ObservableList<Subject> subjects = FXCollections.observableArrayList();
//    public static ObservableList<Subject> getSubjects () {return subjects;}
    public static void main (String[] args) {
        subjects.add(new Subject("computer science", 2));
        subjects.add(new Subject("literature", 4));
        launch (args);
    }
    public void start (Stage primaryStage) throws Exception {
        Parent root = FXMLLoader.load(getClass().getResource("/editMyGrades.fxml"));
        Scene scene = new Scene(root);
        primaryStage.setScene(scene);
        primaryStage.show();
    }
}
Class Subject:
public class Subject {
    private String subjectName;
    private int grade;
    public Subject (String subjectName, int grade) {
        this.subjectName = subjectName;
        this.grade = grade;
    }
    public String getSubjectName () {return subjectName;}
    public int getGrade () {return grade;}
    public void setGrade (int grade) {this.grade = grade;}
}
controlling class editMyGrades:
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.TextField;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.input.MouseEvent;
import java.util.ArrayList;
public class editMyGrades {
    Subject subjectToEdit;
    @FXML
    private TableView<Subject> tableView;
    @FXML
    private TableColumn<Subject, String> subjectCol;
    @FXML
    private TableColumn<Subject, Number> gradeCol;
    @FXML
    private TextField textField;
    @FXML
    private Button changeButton;
    @FXML
    private Button deleteButton;
    @FXML
    public void initialize() {
        subjectCol.setCellValueFactory(new PropertyValueFactory<>("subjectName"));
        gradeCol.setCellValueFactory(new PropertyValueFactory<>("grade"));
        //tableView.setItems (FXCollections.observableArrayList(Main.getSubjects()));
        ObservableList<Subject> subjects = FXCollections.observableArrayList(Main.getSubjects());
        tableView.setItems(subjects);
    }
    @FXML
    private void tableViewClicked(MouseEvent event) {
        if (event.getClickCount() == 2) {
            subjectToEdit = tableView.getSelectionModel().getSelectedItem();
            textField.setText ("" + tableView.getSelectionModel().getSelectedItem().getGrade());
        }
    }
    @FXML
    private void change(ActionEvent event) {
        subjectToEdit.setGrade(Integer.parseInt(textField.getText()));
        textField.clear();
        tableView.refresh();
    }
    @FXML
    private void delete (ActionEvent event) {
        Subject selectedSubject = tableView.getSelectionModel().getSelectedItem();
        ArrayList<Subject> subjects = Main.getSubjects();
        subjects.remove(selectedSubject);
        tableView.refresh();
    }
}
editingMyGrades.fxml:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TableColumn?>
<?import javafx.scene.control.TableView?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.VBox?>
<VBox maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="editMyGrades">
   <children>
      <Label text="change your grades!" />
      <HBox>
         <children>
            <TableView fx:id="tableView" onMouseClicked="#tableViewClicked" prefHeight="200.0" prefWidth="518.0">
              <columns>
                <TableColumn fx:id="subjectCol" prefWidth="262.0" text="subject" />
                <TableColumn fx:id="gradeCol" minWidth="0.0" prefWidth="146.0" text="grade" />
              </columns>
            </TableView>
            <VBox alignment="CENTER">
               <children>
                  <Button mnemonicParsing="false" onAction="#delete" text="deleteButton" />
               </children>
            </VBox>
         </children>
      </HBox>
      <TextField fx:id="textField" maxWidth="100.0" />
      <Button fx:id="changeButton" mnemonicParsing="false" onAction="#change" text="Change!" />
   </children>
</VBox>
