JavaFX scène de transition à partir du contrôleur


Je suis très nouveau sur JavaFX (et java en général) et j'ai essayé de faire la transition entre les scènes d'un contrôleur FXML. J'ai essayé de rechercher plusieurs solutions en ligne cependant, aucune d'entre elles ne semble fonctionner.

Mon code java principal:

package main;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class App extends Application {

public static void main(String[] args) {
    launch(args);
}

@Override
public void start(Stage primaryStage) throws Exception {


    Parent root = FXMLLoader.load(getClass().getResource("Login.fxml"));

    Scene scene1 = new Scene(root);

    primaryStage.setScene(scene1);
    primaryStage.setTitle("Login");
    primaryStage.show();
}

}

... et mon LoginController:

package main;

import java.net.URL;
import java.util.ResourceBundle;

import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.control.Label;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TextField;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;


public class LoginController implements Initializable 
{

@FXML
private Label loginLabel;

@FXML
private TextField fieldUsername;

@FXML 
private PasswordField fieldPassword;


@FXML
public void loginEvent(ActionEvent event) throws Exception{
    //This is where I try to change the scene
    if (fieldUsername.getText().equals("admin")  && fieldPassword.getText().equals("admin")){
    Parent parent = FXMLLoader.load(getClass().getResource("Main.fxml"));
    Stage primaryStage = new Stage();
    Scene scene = new Scene (parent);
    primaryStage.setScene(scene);
    primaryStage.setTitle("Main Frame");
    primaryStage.show();
    }
    else {
        loginLabel.setText("Incorrect Username or Password");
    }
}

@Override
public void initialize(URL arg0, ResourceBundle arg1) {}

}

Voici l'erreur que j'obtiens:

Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at sun.reflect.misc.Trampoline.invoke(Unknown Source)
at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at sun.reflect.misc.MethodUtil.invoke(Unknown Source)
... 48 more
Caused by: javafx.fxml.LoadException: 
/F:/Programming/JAVA/Eclipse/Password%204/bin/main/Main.fxml:9

at javafx.fxml.FXMLLoader.constructLoadException(Unknown Source)
at javafx.fxml.FXMLLoader.access$700(Unknown Source)
at javafx.fxml.FXMLLoader$ValueElement.processAttribute(Unknown Source)
at javafx.fxml.FXMLLoader$InstanceDeclarationElement.processAttribute(Unknown Source)
at javafx.fxml.FXMLLoader$Element.processStartElement(Unknown Source)
at javafx.fxml.FXMLLoader$ValueElement.processStartElement(Unknown Source)
at javafx.fxml.FXMLLoader.processStartElement(Unknown Source)
at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
at javafx.fxml.FXMLLoader.load(Unknown Source)
at main.LoginController.loginEvent(LoginController.java:34)
... 57 more
Caused by: java.lang.ClassNotFoundException: main.MainController
at java.net.URLClassLoader$1.run(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 71 more

Ma façon de changer la scène ne fonctionne pas. Comment pourrais-je aller sur cette question? Merci à l'avance.

Author: user3120921, 2014-12-04

1 answers

Quel est le problème avec votre solution

Votre argument getResourceest incorrect - vous ne devez pas utiliser un chemin de fichier (par exemple F:/) à la place, vous devez utiliser quelque chose lié à votre chemin de classe.

Vous pouvez avoir d'autres erreurs, je n'ai pas vérifié, je voulais juste noter celle évidente.

Comment faire pour résoudre le

La solution la plus simple est de placer le principal.fxml dans le même répertoire que LoginController.java et vérifiez cela, lorsque vous compilez le programme, Principal.fxml a été copié par votre système de construction dans le même répertoire que LoginController.classe.

Pour votre recherche, utilisez simplement FXMLLoader.load(getClass().getResource("Main.fxml")); (de même pour votre connexion.fxml).

Exemple de code

Voici un exemple pour la commutation de scènes basées sur FXML (votre code pourrait être plus simple si vous souhaitez remplacer le contenu de la scène dans son ensemble plutôt que des parties de la scène comme le fait l'exemple).

 0
Author: jewelsea, 2017-05-23 11:57:43