2016-03-26 218 views
0

我想在JavaFX中创建我的第一个应用程序,我有一个调用方法(例如打开另一个窗口)的按钮的问题 - 我总是必须点击它两次为了触发行动。JavaFX按钮反应第二次点击不是第一

下面是从控制器我的代码:

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(); 
    } 
} 
+0

你是如何在这些方法上配置呼叫的?例如。你在'FXML'中定义了点击'忘记'调用'forgetPasswordClicked()'? – Jaims

+0

你可以发布你的'ForgotPassword.fxml'或验证它的配置是否正确? –

回答

2

最有可能你已经在你的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()方法从第一次点击的作品,因为它实际上执行的逻辑,而不是先建立处理程序。

+0

谢谢@Jaims的帮助,第一个选项工作得很好!我也想尝试第二种,但没有成功,也许我犯了一些错误,所以我想问一下当我尝试遵循MVC时哪种选择更好。 – Kattia

+0

@Kattia在这两个选项中,你都在关注MVC。我个人更喜欢将我的方法调用放在FXML中(所以第一个选项)。它不会混淆我的代码。但最有可能的是你个人喜欢的东西。另外,当做一些比按钮上的动作监听器更复杂的事情时,你必须事先初始化它。只要你不需要它,就把它放在FXML中。 – Jaims

+0

非常感谢你:) – Kattia

相关问题