2016-03-26 9 views
0

Ich versuche, meine allererste Anwendung in JavaFX zu erstellen, und ich habe ein Problem mit Button, das eine Methode aufruft (zum Beispiel um ein anderes Fenster zu öffnen) - ich muss es immer zweimal klicken um eine Aktion auszulösen.JavaFX Knopf reagierend auf zweiten Klick nicht zuerst

Hier ist mein Code aus dem 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 
    } 
} 

sind hier Meine Methoden implementiert:

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

Wie haben Sie den Anruf für diese Methoden konfiguriert? Z.B. Haben Sie in Ihrer 'FXML' definiert, dass' 'vergessen' '' forgetPasswordClicked() '' aufruft? – Jaims

+0

Können Sie Ihre 'ForgotPassword.fxml'-Datei posten oder überprüfen, ob sie richtig konfiguriert ist? –

Antwort

2

Wahrscheinlich haben Sie die folgenden in Ihrem FXML haben:

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

Dies macht Ihre Taste forgot rufen Sie Ihre Methode forgetPasswordClicked(). Aber anstatt Ihre Logik zu definieren, ausgeführt werden, wenn der Button angeklickt wird, das erste Mal, wenn Sie sagen: „Wenn diese Schaltfläche geklickt wird, ein action event auf meiner Schaltfläche platzieren, die setUpWindow() nennen“ Deshalb

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

, die ersten Klicken Sie auf "richtet" die Logik Ihrer Schaltfläche ein. Der zweite Klick führt ihn tatsächlich aus. Um dies zu lösen, verwenden Sie entweder sofort Ihre Logik als solche:

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

oder nicht definieren die Methode in Ihrem fxml aufgerufen werden, und bewegen Sie die Initialisierung Ihrer Taste (Einstellung der Aktion Hörer), um Ihre Initialisierung als folgende:

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

Dies auch deshalb Ihre signInClicked() Methode aus dem ersten Klick funktioniert, weil es die Logik tatsächlich ausführt, zuerst die Handler statt einrichten.

+0

Vielen Dank @Jaims für Ihre Hilfe, die erste Option funktionierte gut! Ich wollte auch die zweite versuchen, aber ohne Erfolg, vielleicht habe ich einen Fehler gemacht, also wollte ich fragen, welche Option besser ist, wenn ich versuche, MVC zu folgen. – Kattia

+0

@Kattia In beiden Optionen folgen Sie MVC. Persönlich bevorzuge ich es, meine Methodenaufrufe in die FXML zu stellen (also die erste Option). Es überlastet meinen Code nicht so sehr. Aber am wahrscheinlichsten ist es, was Sie persönlich bevorzugen. Wenn Sie etwas komplizierteres tun als einen Aktionslistener auf einer Schaltfläche, müssen Sie ihn vorher initialisieren. Solange Sie es nicht brauchen, legen Sie es einfach in FXML. – Jaims

+0

vielen dank :) – Kattia

Verwandte Themen