我正在尝试在 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/