2016-03-26 32 views
0

JavaFXで初めてのアプリケーションを作成しようとしていますが、別のウィンドウを開くなど、メソッドを呼び出すButtonに問題があります。行動を引き起こすここでJavaFXボタンは2度目のクリックで反応しません

は、コントローラからの私のコードです:

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'で' forgot'が 'forgetPasswordClicked()'をクリックすると定義しましたか? – Jaims

+0

'ForgotPassword.fxml'を投稿するか、正しく設定されていることを確認できますか? –

答えて

2

ほとんどの場合、あなたのFXMLで次き:

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

これは作りますあなたのボタンforgotはあなたのメソッドforgetPasswordClicked()を呼び出します。しかし、その代わりに、あなたのボタンがクリックされたときに実行されるように、あなたのロジックを定義する、最初の時間は、あなたが言う:あなたの最初のため

forgot.setOnAction(e -> ForgotPassword.setUpWindow()); 

「ボタンをクリックすると、setUpWindow()を呼び出します私のボタンのaction eventを置きます」ボタンのロジックを「設定」します。 2回目のクリックで実際に実行されます。どちらか、これを解決するため、直ちになど、あなたのロジックを使用するには、次のようにあなたの初期化に(アクションリスナーを設定)

public void forgetPasswordClicked() { 
    ForgotPassword.setUpWindow(); 
} 

たり、FXMLに呼び出されるメソッドを定義し、あなたのボタンの初期化を移動しないでください次:それは実際には最初のハンドラを設定するのではなく、ロジックを実行するので、あなたのsignInClicked()方法は、最初のクリックから働く理由でもある

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

+0

ありがとう@あなたの助けを歓迎する、最初のオプションはうまくいった!私はまた、2番目を試してみたいですが、成功していないかもしれません。多分私はいくつかの間違いを犯したので、私はMVCに従うときにどのオプションが良いか尋ねたいと思っていました。 – Kattia

+0

@Kattiaどちらのオプションでも、MVCをフォローしています。個人的には、私のメソッド呼び出しをFXMLに配置する方が好きです(最初のオプションです)。私のコードはそれほど混乱しません。しかし、それはあなたが個人的に好むものです。また、ボタン上のアクションリスナーよりも複雑な操作を行う場合は、事前に初期化する必要があります。あなたがそれを必要としない限り、それをFXMLに入れてください。 – Jaims

+0

ありがとうございました:) – Kattia

関連する問題