Passing parameters between two JavaFX controllers

I want to click a column and send the cell index to a new stage. But I can not pass my parameter ( int clickIndex) to another controller EditClientController. I tried everything, but it still doesn't work.

Maincontroller

package controller;

import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.input.MouseEvent;
import javafx.scene.text.Text;
import javafx.stage.Stage;
import javafx.util.Callback;
import model.Table;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;

public class MainController implements Initializable {

    @FXML
    TableView<Table> tableID;
    @FXML
    TableColumn iLp;
    @FXML
    TableColumn iCity;
    @FXML
    TableColumn iDeviceName;
    @FXML
    TableColumn iSerialNumber;
    @FXML
    TableColumn iCompanyName;
    @FXML
    TableColumn iContact;
    @FXML
    TableColumn iSellDate;
    @FXML
    TableColumn iWarranty;
    @FXML
    TableColumn iNextReview;
    @FXML
    TableColumn iWarrantyTrue;
    @FXML
    Button addButton;
    @FXML
    ComboBox warrantyLength;
    @FXML
    ComboBox nextReview;
    @FXML
    ComboBox warrantyTrue;


    //Define variables
    private int iNumber= 1;
    public int clickIndex;


    //Create table data
     ObservableList<Table> data = FXCollections.observableArrayList();

    //Combo box
    final ObservableList warranty = FXCollections.observableArrayList("---",12,24,36);
    final ObservableList review = FXCollections.observableArrayList("---","tydzień","miesiąc","2 miesiące", "6 miesięcy");
    final ObservableList warrantyTF = FXCollections.observableArrayList("---","tak","nie");



    Callback<TableColumn, TableCell> cellFactory2 =
            new Callback<TableColumn, TableCell>() {
                public TableCell call(TableColumn p) {

                    final TableCell cell = new TableCell<Table, Integer>() {
                        @Override
                        public void updateItem(Integer item, boolean empty) {
                            super.updateItem(item, empty);
                            setText(empty ? null : getString());
                            setGraphic(null);
                        }

                        private String getString() {
                            return getItem() == null ? "" : getItem().toString();
                        }
                    };

                    cell.addEventFilter(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() {
                        @Override
                        public void handle(MouseEvent event) {
                            if (event.getClickCount() > 1) {
                                clickIndex=cell.getIndex();
                                try {
                                    FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("editClient.fxml"));
                                    Parent root1 = (Parent) fxmlLoader.load();
                                    Stage stage = new Stage();
                                    stage.setTitle("Edytuj klienta");
                                    stage.setScene(new Scene(root1));
                                    stage.show();
                                } catch(Exception e) {
                                    e.printStackTrace();
                                }
                            }
                        }
                    });
                    return cell;
                }
            };

    Callback<TableColumn, TableCell> cellFactory =
            new Callback<TableColumn, TableCell>() {
                public TableCell call(TableColumn p) {

                    final TableCell cell = new TableCell<Table, String>() {
                        private Text text;
                        @Override
                        public void updateItem(String item, boolean empty) {
                            super.updateItem(item, empty);
                            text = new Text(item);
                            text.setWrappingWidth(100);
                            setGraphic(text);
                        }

                        private String getString() {
                            return getItem() == null ? "" : getItem().toString();
                        }
                    };

                    cell.addEventFilter(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() {
                        @Override
                        public void handle(MouseEvent event) {
                            if (event.getClickCount() > 1) {
                                clickIndex = cell.getIndex();
                                try {
                                    FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("editClient.fxml"));
                                    Parent root1 = (Parent) fxmlLoader.load();
                                    Stage stage = new Stage();
                                    stage.setTitle("Edytuj klienta");
                                    stage.setScene(new Scene(root1));
                                    stage.show();
                                } catch(Exception e) {
                                    e.printStackTrace();
                                }
                            }
                        }
                    });
                    return cell;
                }
            };

    public void setClickedIndex(int click){
        this.clickIndex=click;
    }

    public int getClickIndex(){
        return clickIndex;
    }


    //Plik
    public void openFile() {
        FileReader plik = null;
        int tab0=1;
        int tab7=0;
        String tab9=null;
        try {
            plik = new FileReader("dane.txt");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        BufferedReader bfr = new BufferedReader(plik);
        String linia = null;

        try {
            while ((linia = bfr.readLine()) != null) {
                String[] tab = linia.split(";");
                tab7=Integer.parseInt(tab[7]);
                if(tab.length==10) {
                    if(tab[9].contains(tab[8])){
                        tab9="Tak";
                    }else{
                        tab9="Nie";
                    }
                }
                Table tablica = new Table(tab0++, tab[1], tab[2], tab[3], tab[4], tab[5], tab[6], tab7, tab[8], tab9);
                data.add(tablica);

            }
        } catch (Exception e) {
            System.out.println("BŁĄD ODCZYTU Z PLIKU!");
            System.exit(2);
        }
        try {
            plik.close();
        } catch (IOException e) {
            System.out.println("BŁĄD PRZY ZAMYKANIU PLIKU!");
            System.exit(3);
        }
    }
    public void setData(ObservableList<Table> newData){
       data=newData;
    }

    public ObservableList<Table> getData(){
        return data;
    }

    public void pressButton(ActionEvent event) throws Exception {
        try {
            FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("addClient.fxml"));
            Parent root1 = (Parent) fxmlLoader.load();
            Stage stage = new Stage();
            stage.setTitle("Dodaj klienta");
            stage.setScene(new Scene(root1));
            stage.show();
        } catch(Exception e) {
            e.printStackTrace();
        }
    }


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

        iLp.setCellValueFactory(new PropertyValueFactory<Table, Integer>("rLp"));
        iCity.setCellValueFactory(new PropertyValueFactory<Table, String>("rCity"));
        iDeviceName.setCellValueFactory(new PropertyValueFactory<Table, String>("rDeviceName"));
        iSerialNumber.setCellValueFactory(new PropertyValueFactory<Table, String>("rSerialNumber"));
        iCompanyName.setCellValueFactory(new PropertyValueFactory<Table, String>("rCompanyName"));
        iContact.setCellValueFactory(new PropertyValueFactory<Table, String>("rContact"));
        iSellDate.setCellValueFactory(new PropertyValueFactory<Table, String>("rSellDate"));
        iWarranty.setCellValueFactory(new PropertyValueFactory<Table, Integer>("rWarranty"));
        iNextReview.setCellValueFactory(new PropertyValueFactory<Table, String>("rNextReview"));
        iWarrantyTrue.setCellValueFactory(new PropertyValueFactory<Table, String>("rWarrantyTrue"));


        iLp.setCellFactory(cellFactory2);
        iCity.setCellFactory(cellFactory);
        iDeviceName.setCellFactory(cellFactory);
        iSerialNumber.setCellFactory(cellFactory);
        iCompanyName.setCellFactory(cellFactory);
        iContact.setCellFactory(cellFactory);
        iSellDate.setCellFactory(cellFactory);
        iWarranty.setCellFactory(cellFactory2);
        iNextReview.setCellFactory(cellFactory);
        iWarrantyTrue.setCellFactory(cellFactory);

        tableID.setItems(data);

        //comboboxy
        warrantyLength.setItems(warranty);
        warrantyLength.getSelectionModel().select(0);
        nextReview.setItems(review);
        nextReview.getSelectionModel().select(0);
        warrantyTrue.setItems(warrantyTF);
        warrantyTrue.getSelectionModel().select(0);
    }

}

EditClientController

package controller;

import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.ComboBox;
import javafx.scene.control.TextField;

import java.net.URL;
import java.util.ResourceBundle;

/**
 * Created by Krzysztof on 2015-01-14.
 */
public class EditClientController implements Initializable {

    @FXML
    ComboBox warrantyLength;
    @FXML
    TextField city;
    public int index;


    //Combo box dla okresu gwarancyjnego
    final ObservableList warranty = FXCollections.observableArrayList("---", 12, 24, 36);

    public void setIndex(int index){
        this.index=index;
    }
    public int getIndex(){
        return index;
    }

    @Override
    public void initialize(URL location, ResourceBundle resources) {
       // city.setText(tablica.get(index).getRCity());
        warrantyLength.setItems(warranty);
        warrantyLength.getSelectionModel().select(0);

    }
}
+4
source share
3 answers

If you want to specify the controller in the FXML file (so that you cannot use the Deepak answer), and you want to access the index in the method initialize()(so you cannot use the José answer), you can use the factory controller:

FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("editClient.fxml"));
fxmlLoader.setControllerFactory(new Callback<Class<?>, Object>() {
    @Override
    public Object call(Class<?> controllerClass) {
        if (controllerClass == EditClientController.class) {
            EditClientController controller = new EditClientController()
            controller.setIndex(clickIndex);
            return controller ;
        } else {
            try {
                return controllerClass.newInstance();
            } catch (Exception exc) {
                throw new RuntimeException(exc); // just bail
            }
        }
    }
});
Parent root1 = fxmlLoader.load();
+5
source

All you have to do is get an instance of your second controller:

EditClientController controller=fxmlLoader.<EditClientController>getController();

:

controller.setIndex(clickIndex);

, :

    try {
        FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("editClient.fxml"));
        Parent root1 = (Parent) fxmlLoader.load();
        EditClientController controller=fxmlLoader.<EditClientController>getController();
        controller.setIndex(clickIndex);
        Stage stage = new Stage();
        stage.setTitle("Edytuj klienta");
        stage.setScene(new Scene(root1));
        stage.show();
    } catch(Exception e) {
        e.printStackTrace();
    }

EDIT

clickIndex , Initialize.

:

private IntegerProperty index = new SimpleIntegerProperty(-1);

public void setIndex(int index){
    this.index.set(index);
}
public int getIndex(){
    return index.get();
}

@Override
public void initialize(URL location, ResourceBundle resources) {
    index.addListener((ob,n,n1)->{
        city.setText(tablica.get(n1.intValue()).getRCity());
    });

}
+2

( ) EditClientController

:

FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("editClient.fxml"));
EditClientController ctrl = new EditClientController();
ctrl.setCellIndex(id);
fxmlLoader.setController(ctrl);

fxml, :

editWrapper.getCurrentController().setCellIndex(id);

editControllerWrapper - , getCurrentController, javafx.

:   public class EditControllerWrapper {

private Parent root;


public EditControllerWrapper () {
    try
    {
        FXMLLoader loader = new FXMLLoader(getClass().getResource("editClient.fxml"),                           
        ...
    } catch (Exception e) {
        ...
    }
}


public <T> T getCurrentController ()  {
    return loader.getController();
}
+1
source

All Articles