JavaFX按钮不是先响应第二次点击

我试图在JavaFX中创建我的第一个应用程序,我有一个问题,调用一个方法的Button(例如打开另一个窗口) – 我总是要点击它两次才能触发操作。

这是我在Controller中的代码:

import javafx.fxml.FXML; import javafx.scene.control.Button; public class ControllerSignIn { @FXML private Button forgot; @FXML private Button back; @FXML private Button signin; public void forgetPasswordClicked() { forgot.setOnAction(e -> ForgotPassword.setUpWindow()); //works on 2nd click } public void backClicked() { back.setOnAction(e -> ForgotPassword.closeWindow()); //works on 2nd click } public void signInClicked() { System.out.println("Sign In CLICKED"); //works on first click } } 

我的方法在这里实现:

 import javafx.fxml.FXMLLoader; import javafx.scene.Parent; import javafx.scene.Scene; import javafx.stage.Modality; import javafx.stage.Stage; import java.io.IOException; public class ForgotPassword { static Stage window; static Scene scene; static Parent root; private static void loadFXML() { try { root = FXMLLoader.load(ForgotPassword.class.getResource("ForgotPassword.fxml")); } catch (IOException e) { e.printStackTrace(); } } public static void setUpWindow() { loadFXML(); scene = new Scene(root); scene.getStylesheets().add("signin/SignIn.css"); window = new Stage(); window.initModality(Modality.APPLICATION_MODAL); window.setTitle("Forgot Password?"); window.setScene(scene); window.showAndWait(); } public static void closeWindow() { window.close(); } } 

您最有可能在FXML中拥有以下内容:

  

这会让你的按钮forgot调用你的方法forgetPasswordClicked() 。 但是,当您单击按钮时,不是定义要执行的逻辑,而是第一次说:“单击此按钮时,在我的按钮上放置一个action event ,它将调用setUpWindow()

 forgot.setOnAction(e -> ForgotPassword.setUpWindow()); 

因此,首次单击“设置”按钮的逻辑。 第二次点击,实际执行它。 要解决这个问题,请立即使用您的逻辑:

 public void forgetPasswordClicked() { ForgotPassword.setUpWindow(); } 

或者不定义要在fxml中调用的方法,并将按钮的初始化(设置动作侦听器)移动到初始化,如下所示:

 public class ControllerSignIn implements Initializable { @FXML private Button forgot; @FXML private Button back; @Override public void initialize(URL location, ResourceBundle resources) { forgot.setOnAction(e -> ForgotPassword.setUpWindow()); back.setOnAction(e -> ForgotPassword.closeWindow()); } } 

这也是您的signInClicked()方法从第一次单击开始工作的原因,因为它实际上执行逻辑而不是首先设置处理程序。

Interesting Posts