我正在构建一个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);
}
}
发布于 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);
}
}
发布于 2018-08-23 01:02:38
不完全是您描述的功能,但可能使用通道可以工作(它防止输入事件在所有者或应用程序上处理,具体取决于通道):
stage.initModality(Modality.WINDOW_MODAL);
stage.initOwner(((Node) event.getSouce()).getScene().getWindow());
stage.show();
发布于 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);
}
}
https://stackoverflow.com/questions/51971701
复制相似问题