Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Passing parameters between two JavaFX controllers

Tags:

java

javafx

I want to click a column and send the cell index to a new stage. But I can't pass my parameter (int clickIndex) to another controller EditClientController. I've tried everything, but it still does not 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);

    }
}
like image 463
Kertt123 Avatar asked Dec 25 '22 00:12

Kertt123


1 Answers

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

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();
like image 151
James_D Avatar answered Dec 28 '22 07:12

James_D