2015-01-15 7 views
3

Я хочу щелкнуть столбец и отправить индекс ячейки на новый этап. Но я не могу передать свой параметр (int clickIndex) другому контроллеру EditClientController. Я все пробовал, но он все равно не работает.Передача параметров между двумя контроллерами JavaFX

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); 

    } 
} 

ответ

5

Если вы хотите, чтобы указать контроллер в файле FXML (так что вы не можете использовать ответ Дипак в) и вы хотите получить доступ к индексу в initialize() метода (так что вы не можете использовать ответ Хосе), вы можете использовать контроллер завод:

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(); 
+0

Обратите внимание, что при таком подходе вы даже можете сделать индекс конструктором и избавиться от 'setIndex (...)' метод если хотите. –

+0

Большое вам спасибо! Наконец-то работает. – Kertt123

2

Все, что вам нужно сделать, это получить экземпляр вашего второго контроллера:

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()); 
    }); 

} 
+0

Я судимый этот путь, но все время у меня есть cellIndex = 0 – Kertt123

+0

ли вы имеете в виду на 'EditClientControlle r'? Вы не можете оценить 'index' в методе' Initialize'. Вы должны называть 'city.setText (tablica.get (index) .getRCity());' после вызова 'setIndex()' (внутри него или добавления слушателя к изменениям в индексе). –

+0

Я отредактировал свой ответ с решением для этого (в случае, если это была ваша проблема) –

1

При переходе от одного контроллера к другому (одного вида в другой), можно инициализировать 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.

Например: общественного класса 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(); 
} 
Смежные вопросы