Search code examples
javajavafx-8

How to refresh database tableview after updating or Deleting In Javafx?


I have two Controller class(Controller and Dailog Controller). COntroller class has tableView. On Double click on Tableview row the Dialog popup. The dialogController class has two button i.e update and delete. The Update button updating and deleting data in database. After updating or deleting i want to refresh tableview. The problem is tablview refresh method is in Controller class. So how can i refresh it?

    public class Controller implements Initializable{



    @FXML
    private TabPane tabPane;

     @FXML
     private Tab createTaskTab;

     @FXML
     private TextArea textArea;

     @FXML
     private Button saveBtn;

     @FXML
     private Tab viewTasksTab;

    @FXML
    private TableView<Task> tableView;

    @FXML
    private TableColumn<Task, Integer> idColumn;

    @FXML
    private TableColumn<Task, String> dateColumn;

    @FXML
    private TableColumn<Task, String> timeColumn;

    @FXML
    private TableColumn<Task, String> taskColumn;

    @FXML
    private TableColumn<Task, String> statusColumn;


    @FXML
    void saveTask(ActionEvent event) {

        String getTask = textArea.getText();

        if(getTask.length() > 0)
        {
            MysqlConnection mysqlConnection = new MysqlConnection();
            int count = mysqlConnection.insertTask(getTask);
            if(count > 0)
            {
                Alert alert = new Alert(AlertType.INFORMATION);
                alert.setTitle("Saved");
                alert.setContentText("Task Saved");
                alert.show();
                textArea.clear();
            }
        }
        else
        {
            Alert alert = new Alert(AlertType.WARNING);
            alert.setTitle("Empty TextArea");
            alert.setContentText("Please write the task");
            alert.show();
        }
    }

    @FXML
    public void viewTasks(Event e)
    {
        try{

            tabPane.getSelectionModel().selectedItemProperty().addListener(
                    new ChangeListener<Tab>() {

                        @Override
                        public void changed(ObservableValue<? extends Tab> observable, Tab oldValue, Tab newValue) {

                            if(newValue == viewTasksTab)
                            {

                                refreshTable();
                            }

                        }
                    });

        }catch(Exception exception)
        {
            System.out.println("Exception in viewTasks");
        }

    }

    protected void refreshTable() {

        MysqlConnection myconn = new MysqlConnection();
        idColumn.setCellValueFactory(new PropertyValueFactory<>("id"));
        dateColumn.setCellValueFactory(new PropertyValueFactory<>("date"));
        timeColumn.setCellValueFactory(new PropertyValueFactory<>("time"));
        taskColumn.setCellValueFactory(new PropertyValueFactory<>("task"));
        statusColumn.setCellValueFactory(new PropertyValueFactory<>("status"));
        tableView.setItems(myconn.fetchTasks());
    }

    @FXML
    public void onEdit(MouseEvent event)
    {
        if(event.getClickCount() == 2){

            Task selectedTask = tableView.getSelectionModel().getSelectedItem();
            Scene scene;
            Stage stage;
            try {
                FXMLLoader loader = new FXMLLoader(getClass().getResource("DialogBox.fxml"));
                Parent root = (Parent) loader.load();
                DialogBoxController dialog = loader.getController();
                dialog.editTask(selectedTask);
                scene = new Scene(root);
                stage = new Stage();
                stage.initModality(Modality.APPLICATION_MODAL);
                stage.setScene(scene);
                stage.showAndWait();

            } catch (IOException e) {

                System.out.println("Exception in onEdit"+e.getMessage());
            }
        }
    }

    @Override
    public void initialize(URL location, ResourceBundle resources) {


    }



}

DialogController class:

[public class DialogBoxController implements Initializable{


@FXML
private Label idLabel;

@FXML
private Label dateLabel;

@FXML
private Label timeLabel;

@FXML
private ComboBox<String> statusComboBox;

@FXML
private TextArea textAreaDialog;

@FXML
private Button updateBtn;

@FXML
private Button deleteBtn;



private void closeStage(ActionEvent event) {

    Node source = (Node) event.getSource();
    Stage stage = (Stage) source.getScene().getWindow();
    stage.close();
}

public void editTask(Task task)
{

    idLabel.setText(""+task.getId());
    dateLabel.setText(task.getDate());
    timeLabel.setText(task.getTime());
    textAreaDialog.setText(task.getTask());
    statusComboBox.setValue(task.getStatus());
    textAreaDialog.setEditable(false);
}

@FXML
public void update(ActionEvent event){

    int taskID = Integer.parseInt(idLabel.getText());
    String status = statusComboBox.getSelectionModel().getSelectedItem().toString();
    MysqlConnection myconn = new MysqlConnection();
    myconn.updateTask(taskID, status);
    closeStage(event);
}

@FXML
public void delete(ActionEvent event){

    int taskID = Integer.parseInt(idLabel.getText());
    MysqlConnection myconn = new MysqlConnection();
    myconn.deleteTask(taskID);
    closeStage(event);

}

@Override
public void initialize(URL location, ResourceBundle resources) {

    statusComboBox.getItems().addAll("Pending","Done","Aborted");


}

Snapcshot of Application


Solution

  • You can add this to the DialogBoxController class:

    public class DialogBoxController {
    private Controller controller;
    public void setController(Controller controller){
        this.controller = controller;
    }
    @FXML
    public void delete(ActionEvent event){
    
        // Your code
        controller.refreshTable();
        closeStage(event);
    
    }}
    

    And in the Controller:

    DialogBoxController dialog = loader.getController();
        dialog.editTask(selectedTask);
        dialog.setController(this);