带有隐藏和显示的JavaFX阶段问题
我正在构建一个应用程序,它会显示一个窗口,询问用户是否要使用两个按钮选项挂起计算机,其中一个按钮选项为“是”,电脑挂起 另一个名为“稍后”的按钮应该隐藏窗口,一个小时后它再次出现并提出相同的问题 “后来的巴特顿”的代码 您在代码中看到的布尔值是bc,这是我认为我可以控制它的方式,相信我,我尝试了不同的方式,但没有人帮我解决这个问题,下面是GUI类的代码带有隐藏和显示的JavaFX阶段问题,java,javafx,javafx-8,fxml,Java,Javafx,Javafx 8,Fxml,我正在构建一个应用程序,它会显示一个窗口,询问用户是否要使用两个按钮选项挂起计算机,其中一个按钮选项为“是”,电脑挂起 另一个名为“稍后”的按钮应该隐藏窗口,一个小时后它再次出现并提出相同的问题 “后来的巴特顿”的代码 您在代码中看到的布尔值是bc,这是我认为我可以控制它的方式,相信我,我尝试了不同的方式,但没有人帮我解决这个问题,下面是GUI类的代码 public class Gui extends Application { public Stage classStage = new S
public class Gui extends Application {
public Stage classStage = new Stage();
public static boolean Done=true;
public static boolean flag=true;
public Gui() {
}
@Override
public void start(Stage primaryStage) throws Exception {
Done = Controller.isDone();
classStage = primaryStage;
Rectangle2D primaryScreenBounds = Screen.getPrimary().getVisualBounds();
primaryStage.setX(primaryScreenBounds.getMaxX() - primaryScreenBounds.getWidth());
primaryStage.setY(primaryScreenBounds.getMaxY() - primaryScreenBounds.getHeight());
primaryStage.setAlwaysOnTop(true);
Parent root = FXMLLoader.load(getClass().getResource("MainWindow.fxml"));
primaryStage.setTitle("Alerta suspencion de equipo");
primaryStage.setScene(new Scene(root));
primaryStage.setResizable(false);
primaryStage.initStyle(StageStyle.UNDECORATED);
if (Controller.isDone() == true) {
primaryStage.show();
} else if(Controller.isDone() == false) {
primaryStage.hide();
Platform.exit(); // this is the only way that the windows close
}
}
我知道那个站台;杀死程序,但我只使用.hide();在舞台上什么都没有发生,窗口从来没有关闭过,最糟糕的是当我使用Platform.exit()命令时,我无法使画面再次出现
有人知道一种在特定时间后更容易隐藏和显示窗口的方法吗?也许我做错了
问候 您的问题中的代码中到底发生了什么还不是很清楚。底线是,您不应该自己创建
应用程序的实例;唯一的应用程序
实例应该是为您创建的实例
实际上,我并不认为有必要为您所展示的功能创建一个单独的类(当然,您可以这样做)。如果按下“否”按钮,您只需隐藏classStage
,然后在一小时后再次打开它:
noButton.setOnAction(event -> {
Done=false; //boolean to close and open the frame
classStage.hide();
PauseTransition oneHourPause = new PauseTransition(Duration.hours(1));
oneHourPause.setOnFinished(e -> showUI(classStage));
oneHourPause.play();
});
// ...
private void showUI(Stage stage) {
Rectangle2D primaryScreenBounds = Screen.getPrimary().getVisualBounds();
stage.setX(primaryScreenBounds.getMaxX() - primaryScreenBounds.getWidth());
stage.setY(primaryScreenBounds.getMaxY() - primaryScreenBounds.getHeight());
stage.setAlwaysOnTop(true);
Parent root = FXMLLoader.load(getClass().getResource("MainWindow.fxml"));
stage.setTitle("Alerta suspencion de equipo");
stage.setScene(new Scene(root));
stage.setResizable(false);
stage.initStyle(StageStyle.UNDECORATED);
stage.show();
}
请注意,默认情况下,如果最后一个窗口关闭,FX应用程序将退出。因此,您应该调用Platform.setImplicitExit(false)在init()
或start()
方法中
我假设您正在重新加载FXML文件,因为用户界面自上次加载以来可能已更改。显然,如果不是这样的话,你所要做的就是重新展示舞台:
noButton.setOnAction(event -> {
Done=false; //boolean to close and open the frame
classStage.hide();
PauseTransition oneHourPause = new PauseTransition(Duration.hours(1));
oneHourPause.setOnFinished(e -> classStage.show());
oneHourPause.play();
});
你的问题中的代码中到底发生了什么还不是很清楚。底线是,您不应该自己创建应用程序的实例;唯一的应用程序
实例应该是为您创建的实例
实际上,我并不认为有必要为您所展示的功能创建一个单独的类(当然,您可以这样做)。如果按下“否”按钮,您只需隐藏classStage
,然后在一小时后再次打开它:
noButton.setOnAction(event -> {
Done=false; //boolean to close and open the frame
classStage.hide();
PauseTransition oneHourPause = new PauseTransition(Duration.hours(1));
oneHourPause.setOnFinished(e -> showUI(classStage));
oneHourPause.play();
});
// ...
private void showUI(Stage stage) {
Rectangle2D primaryScreenBounds = Screen.getPrimary().getVisualBounds();
stage.setX(primaryScreenBounds.getMaxX() - primaryScreenBounds.getWidth());
stage.setY(primaryScreenBounds.getMaxY() - primaryScreenBounds.getHeight());
stage.setAlwaysOnTop(true);
Parent root = FXMLLoader.load(getClass().getResource("MainWindow.fxml"));
stage.setTitle("Alerta suspencion de equipo");
stage.setScene(new Scene(root));
stage.setResizable(false);
stage.initStyle(StageStyle.UNDECORATED);
stage.show();
}
请注意,默认情况下,如果最后一个窗口关闭,FX应用程序将退出。因此,您应该调用Platform.setImplicitExit(false)在init()
或start()
方法中
我假设您正在重新加载FXML文件,因为用户界面自上次加载以来可能已更改。显然,如果不是这样的话,你所要做的就是重新展示舞台:
noButton.setOnAction(event -> {
Done=false; //boolean to close and open the frame
classStage.hide();
PauseTransition oneHourPause = new PauseTransition(Duration.hours(1));
oneHourPause.setOnFinished(e -> classStage.show());
oneHourPause.play();
});
您可以使用线程
或暂停转换
。建议使用第二种方法。为什么要实例化应用程序
子类?假设您已经有了另一个应用程序
子类,因为您的JavaFX应用程序已经在运行。JavaFX程序中应该只有一个应用程序
实例,它应该是启动FX应用程序时为您创建的实例。不清楚为什么classStage.hide()
不起作用:这与您发布的代码无关。创建一个复制问题和您的问题以将其包括在内的列表。您应该能够用几十行代码编写一个完整的示例,其中包含您所描述的功能(两个按钮等),这对于这里的一个问题来说是在可接受的范围内的。好的,我会这样做的,给我一分钟时间@James_Dy您可以使用线程
或暂停转换
。建议使用第二种方法。为什么要实例化应用程序
子类?假设您已经有了另一个应用程序
子类,因为您的JavaFX应用程序已经在运行。JavaFX程序中应该只有一个应用程序
实例,它应该是启动FX应用程序时为您创建的实例。不清楚为什么classStage.hide()
不起作用:这与您发布的代码无关。创建一个复制问题和您的问题以将其包括在内的列表。您应该能够用几十行代码编写一个完整的示例,其中包含您所描述的功能(两个按钮等),这对于这里的一个问题来说是在可接受的范围内的。好的,我会这样做的,给我一分钟时间@James_dac实际上最大的问题之一是classStage.hide方法不起作用,stage永远不会隐藏。@ChristopherRangel那么代码中还有其他错误,本质上与您发布的所有内容不同。实际上最大的问题之一是classStage.hide方法不起作用,舞台永远不会隐藏。@christopherlangel那么你的代码中还有其他错误,本质上与你发布的所有内容是分离的。