2016-03-26 132 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

相關問題