首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >防止多个窗口并在失去焦点时关闭窗口JAVAFX

防止多个窗口并在失去焦点时关闭窗口JAVAFX
EN

Stack Overflow用户
提问于 2018-08-23 00:53:40
回答 4查看 991关注 0票数 1

我正在构建一个javafx应用程序,其中有一个更改密码的按钮,为此,在执行操作时,我希望加载一个新的更改密码的FXML。这很简单,我知道,但我的问题是在每个按钮上点击一个新的更改密码窗口是打开的。或者,有没有办法关闭更改密码窗口时,它失去了焦点,即如果我点击其他地方。

@FXML
private void CPassBtn(ActionEvent event) {

  try 
    {
        Parent part = FXMLLoader.load(getClass().getResource("/EmpSalary/ui/Mainwin/forChangePass.fxml"));
        Stage stage = new Stage();
        stage.setResizable(false);
        stage.getIcons().add(new Image("/resources/letter.png"));
        stage.setScene(new Scene(part));

        stage.setTitle("Password change");
        stage.show();

    }
    catch (IOException ex) {
        Logger.getLogger(LoginuiController.class.getName()).log(Level.SEVERE, null, ex);
    }
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-08-23 21:06:46

此解决方案在焦点更改时进行检查,并在阶段失去焦点时关闭

public class Main extends Application {

    public static void main(String[] args) { launch(args); }

    @Override
    public void start(Stage primaryStage) {
        Button button = new Button("Password Window");

        Scene scene = new Scene(button);
        primaryStage.setScene(scene);
        primaryStage.show();

        button.setOnAction(event -> System.out.println(openPasswordWindow()));
    }

    private String openPasswordWindow(){
        PasswordField passwordField = new PasswordField();
        Stage stage = new Stage(StageStyle.UTILITY);
        stage.setScene(new Scene(passwordField));
        stage.show();

        //You would need from here 
        stage.focusedProperty().addListener((ov, onHidden, onShown) -> {
            if(!stage.isFocused())
                Platform.runLater(() -> stage.close());
        });
        //Down to here

        return passwordField.getText();
    }
}

在您的代码中,它将如下所示

@FXML
private void CPassBtn(ActionEvent event) {

    try
    {
        Parent part = FXMLLoader.load(getClass().getResource("/EmpSalary/ui/Mainwin/forChangePass.fxml"));
        Stage stage = new Stage();
        stage.setResizable(false);
        stage.getIcons().add(new Image("/resources/letter.png"));
        stage.setScene(new Scene(part));

        stage.setTitle("Password change");
        stage.show();

        stage.focusedProperty().addListener((ov, onHidden, onShown) -> {
            if(!stage.isFocused())
                Platform.runLater(() -> stage.close());
        });
    }
    catch (IOException ex) {
        Logger.getLogger(LoginuiController.class.getName()).log(Level.SEVERE, null, ex);
    }
}
票数 0
EN

Stack Overflow用户

发布于 2018-08-23 01:02:38

不完全是您描述的功能,但可能使用通道可以工作(它防止输入事件在所有者或应用程序上处理,具体取决于通道):

stage.initModality(Modality.WINDOW_MODAL);
stage.initOwner(((Node) event.getSouce()).getScene().getWindow());
stage.show();
票数 1
EN

Stack Overflow用户

发布于 2018-08-23 03:36:11

您可以使用布尔值阻止多个窗口,以检查是否已加载

    private boolean stageLoaded = false ;


  @FXML private void CPassBtn(ActionEvent event) {

   try 
{ 
    if(stageLoaded){ return;}
    Parent part = FXMLLoader.load(getClass().getResource("/EmpSalary/ui/Mainwin/forChangePass.fxml"));
    Stage stage = new Stage();
    stage.setResizable(false);
    stage.getIcons().add(new Image("/resources/letter.png"));
    stage.setScene(new Scene(part));

    stage.setTitle("Password change");
    stage.show();

    stageLoaded = true ;
}
catch (IOException ex) {
    Logger.getLogger(LoginuiController.class.getName()).log(Level.SEVERE, null, ex);
}
}

但是如果您需要再次设置stageLoaded = false。您需要添加一个事件stage.setOnCloseRequest

private boolean stageLoaded = false ;


   @FXML private void CPassBtn(ActionEvent event) {

   try 
{ 
if(stageLoaded){ return;}
Parent part =FXMLLoader.load(getClass().getResource("/EmpSalary/ui/Mainwin/forChangePa 
ss.fxml"));
Stage stage = new Stage();
stage.setResizable(false);
stage.getIcons().add(new Image("/resources/letter.png"));
stage.setScene(new Scene(part));

stage.setTitle("Password change");
stage.show();

stageLoaded = true ;
 stage.setOnCloseRequest((WindowEvent even) -> {
                stageLoaded = false;

}
 catch (IOException ex) {
Logger.getLogger(LoginuiController.class.getName()).log(Level.SEVERE, 
 null, ex);
 }
 }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51971701

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档