我有两个控制器。一个控制器管理大部分主要功能,另一个控制器控制一个简单的弹出提示,从主控制器访问。
这是存储在主控制器中的功能,用于访问提示符。
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");
}
}
这是提示控制器
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文件的块。
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();
}
}
}
除了一件事,一切都在起作用。从提示控制器获取结果时,主控制器无法获得正确的布尔结果。
按下删除时的输出:
D
Canceled
按下取消时的输出:
C
Canceled
D后面应该是Deleted。
一切都有帮助。
答案 0 :(得分:1)
FXMLLoader
创建一个新的控制器实例,因为fxml中提供了fx:controller
属性。
你基本上有两个选择:
从fxml中删除fx:controller
属性并自行指定控制器:
public void showWindow(String path){
try {
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource(path));
fxmlLoader.setController(this);
Parent root = fxmlLoader.load();
或
获取FXMLLoader
public 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;
}