JavaFX按钮对第二次单击的反应不是第一次
我正在尝试用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中包含以下内容:
<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()方法从第一次单击开始就起作用的原因,因为它实际上是在执行逻辑,而不是先设置处理程序。
以上是 JavaFX按钮对第二次单击的反应不是第一次 的全部内容, 来源链接: utcz.com/qa/418659.html







