我有两个 Controller 。一个 Controller 管理大部分主要功能,另一个 Controller 控制一个简单的弹出提示,可从主 Controller 访问。
这是存储在主 Controller 中的函数,用于访问提示符。
public void deletePrompt(){
DeletePromptController controller = new DeletePromptController();
boolean result = controller.showPrompt("/MainWindow//DeletePrompt.fxml");
if(result){
System.out.println("Deleted");
}else{
System.out.println("Canceled");
}
}
这是提示 Controller
public class DeletePromptController extends ShowWindow {
public Label question;
public Button delete, cancel;
private boolean result = true;
boolean showPrompt(String path){
showWindow(path);
return result;
}
public void delete(){
System.out.println("D");
result = true;
Stage stage = (Stage) delete.getScene().getWindow();
stage.close();
}
public void cancel(){
System.out.println("C");
result = false;
Stage stage = (Stage) cancel.getScene().getWindow();
stage.close();
}
}
这是用于加载和显示删除提示 fxml 文件的 block 。
public class ShowWindow {
public void showWindow(String path){
try {
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource(path));
Parent root = fxmlLoader.load();
Stage stage = new Stage();
stage.initModality(Modality.APPLICATION_MODAL);
stage.setScene(new Scene(root));
stage.showAndWait();
}catch(IOException ex){
ex.printStackTrace();
}
}
}
除了一件事之外,一切都正常。主 Controller 从提示 Controller 获取结果时没有得到正确的 boolean 结果。
按下删除键时的输出:
D
Canceled
按下取消时的输出:
C
Canceled
D 后面应该是已删除。
任何事情都有帮助。
最佳答案
FXMLLoader
创建一个新的 Controller 实例,因为 fxml 中提供了 fx:controller
属性。
你基本上有两个选择:
从 fxml 中删除
fx:controller
属性并自行指定 Controller :public void showWindow(String path){ try { FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource(path)); fxmlLoader.setController(this); Parent root = fxmlLoader.load();
或
获取由
FXMLLoader
创建的 Controllerpublic static <T> T showWindow(String path){ try { FXMLLoader fxmlLoader = new FXMLLoader(ShowWindow.class.getResource(path)); Parent root = fxmlLoader.load(); Stage stage = new Stage(); stage.initModality(Modality.APPLICATION_MODAL); stage.setScene(new Scene(root)); stage.showAndWait(); return fxmlLoader.getController(); }catch(IOException ex){ ex.printStackTrace(); } return null; }
boolean showPrompt(String path) { return ShowWindow.<DeletePromptController>showWindow(path).result; }
关于JavaFX 将正确的数据从一个 Controller 返回到另一个 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37478859/