【问题标题】:JavaFX button reacting on second click not firstJavaFX按钮在第二次点击时反应不是第一次
【发布时间】:2016-07-14 10:50:47
【问题描述】:

我正在尝试在 JavaFX 中创建我的第一个应用程序,但我遇到了调用方法(例如打开另一个窗口)的 Button 问题 - 我总是必须单击它两次才能触发操作。

这是我的控制器代码:

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()
  • 您能否发布您的ForgotPassword.fxml 或验证其配置是否正确?

标签: java oop button intellij-idea javafx


【解决方案1】:

您的 FXML 中很可能包含以下内容:

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

这会让你的按钮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() 方法从第一次点击就起作用的原因,因为它实际上执行逻辑而不是首先设置处理程序。

【讨论】:

  • 感谢@Jaims 的帮助,第一个选项效果很好!我也想尝试第二个但没有成功,也许我犯了一些错误,所以我想问当我尝试遵循 MVC 时哪个选项更好。
  • @Kattia 在这两个选项中,您都在关注 MVC。就我个人而言,我更喜欢将我的方法调用放在 FXML 中(所以是第一个选项)。它不会使我的代码混乱。但很可能这是你个人更喜欢的。此外,当在按钮上执行比动作侦听器更复杂的操作时,您必须事先对其进行初始化。只要你不需要,直接放在FXML中即可。
猜你喜欢
  • 2021-11-03
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-05
  • 1970-01-01
  • 1970-01-01
  • 2020-06-25
相关资源
最近更新 更多