JavaFX 按钮对第二次单击而不是第一次单击使用react

标签 java oop button intellij-idea 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 中很可能包含以下内容:

<Button fx:id="forgot" onAction="#forgetPasswordClicked" />

这会使您的按钮forgot调用您的方法forgetPasswordClicked()。但是,您不是定义单击按钮时要执行的逻辑,而是第一次说:“单击此按钮时,在我的按钮上放置一个 action 事件,该事件将调用 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() 方法从第一次单击开始就起作用,因为它实际上执行逻辑而不是首先设置处理程序。

关于JavaFX 按钮对第二次单击而不是第一次单击使用react,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36240988/

相关文章:

java - 哪个模式在java : passing objects to a method or using composition?中耦合度较低

ios - 单击按钮不播放音频

C#:糟糕的类设计(第一个 OOP)

c++ - 在 C++ 中通过析构函数销毁动态数组的 vector

带有 this 自身引用的 JavaScript 函数对象

button - 控件 P5 - 在按钮标签中显示数字

android - Android:按下按钮以快速重置 Activity 会导致程序崩溃

java - 我的 Android Studio 模拟器无法正常工作

java - 是否有跨操作系统在 Eclipse 中调试 Java 进程的指南?

java - 当尝试部分模拟 void 方法时,我收到 NotAMockException - 我做错了什么?