在两个JavaFX控制器之间传递参数
我想单击一列并将单元格索引发送到新阶段。但是我无法将参数(int
clickIndex)传递给另一个控制器EditClientController
。我已经尝试了所有方法,但仍然无法正常工作。
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);
}
}
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);
}
}
回答:
如果要在FXML文件中指定控制器(因此您不能使用Deepak的答案), 并且
要访问initialize()
方法中的索引(因此您不能使用José的答案),则可以使用控制器工厂:
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();
以上是 在两个JavaFX控制器之间传递参数 的全部内容, 来源链接: utcz.com/qa/397647.html