IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaFX Discussion :

Liaison entre classe de calcul et interface Javafx


Sujet :

JavaFX

  1. #21
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Pas si complet que cela, un des FXML est coupé avant la fin et il y a des variables non-déclarées ici et là. Et puis plutôt que d'aller éditer d'anciens messages, ce qui rend la discussion difficile à suivre mieux valait reposter le code à la suite. Et comme je l'ai dit, je me contre-fiche d'avoir ton code au complet, ce qui m’intéresse c'est le cœur du problème. Car ça montre bien du coup que toi-même tu es incapable d'isoler la partie de ton code qui de pose du soucis et de réduire le problème à un test simple et donc ça signifie que tu ne comprends pas ton propre programme. De plus, outre ces bonnes pratiques, il n'y a pas de honte non-plus d'indiquer qu'on débute ou qu'on est pas sur de ce qu'on fait plutôt que de balancer toute la sauce en espérant qu'une autre personne arrive à tout dépatouiller à ta place.

    Commençons par le commencement de manière à virer la dépendance à AWT.
    Dans Main, MyControllerFenetrePrincipale et MyControllerFenetreTuto1, on replace :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dimension dimension = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
        int h = (int) dimension.getHeight();
        int l = (int) dimension.getWidth();
    par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     Rectangle2D primaryScreenBounds = Screen.getPrimary().getVisualBounds();
        double h = primaryScreenBounds.getHeight();
        double l = primaryScreenBounds.getWidth();
    Mais bon ça fait un peut bête d'avoir ça à 3 endroit différents, en général on a besoin de la taille de l'écran que dans l'application et c'est aux autres écrans de se mettre correctement en page à partir de là dans l'espace d'affichage qui leur est attribué.
    De plus il faudrait quand même tenir compte de la valeur x et y de la bouding box qui indiquent la partie affichage de l'écran (par exemple sur les OS où la barre système n'est pas en bas de l'écran, ces valeurs peuvent être différentes de (0,0)).

    D'ailleurs j'avoue que je ne comprends pas du tout l’intérêt d'invoquer relocate() manuellement a plusieurs endroits en fonction de la taille de l'écran mais avec des constantes ... bref, il semble manquer une compréhension du fonctionnement des layouts, d'AnchorPane et de StackPane. Bref, j'ai du en enlever la plus grande partie sinon tout s'affichait en dehors de mon écran .

    Pourquoi, mais alors pourquoi test1 est-il déclaré static dans la classe Main ?????????????????????
    ces deux lignes sont à supprimer, elles n'ont rien à faire ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public static Gestes test1 = new Gestes();
     
    [...]
     
    test1.start();
    On va commencer par modifier MyScreenController pour qu'il conserve des références vers les divers contrôleurs (si tu n'arrives pas à voir la différente, utilise un utilitaire de diff genre WinMerge pour comparer les deux versions, la tienne et la mienne) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    public class MyScreenController extends AnchorPane {
     
        public HashMap<String, Pair<Node, ControlledScreen>> screens = new HashMap<>();
     
        public MyScreenController() {
            super();
        }
     
        public void addScreen(String name, Node screen, ControlledScreen controller) {
            screens.put(name, new Pair<>(screen, controller));
        }
     
        public Pair<Node, ControlledScreen> getScreen(String name) {
            return screens.get(name);
        }
     
        public boolean loadScreen(String name, String resource) {
            try {
                FXMLLoader myLoader = new FXMLLoader(getClass().getResource(
                        resource));
                Parent loadScreen = (Parent) myLoader.load();
                ControlledScreen myScreenControler = ((ControlledScreen) myLoader
                        .getController());
                myScreenControler.setScreenParent(this);
                addScreen(name, loadScreen, myScreenControler);
                return true;
            } catch (Exception e) {
                System.out.println(e.getMessage());
                return false;
            }
        }
     
        public boolean setScreen(final String name) {
            if (screens.get(name) != null) { // screen loaded
                final DoubleProperty opacity = opacityProperty();
     
                if (!getChildren().isEmpty()) { // if there is more than one screen
                    Timeline fade = new Timeline(new KeyFrame(Duration.ZERO,
                            new KeyValue(opacity, 1.0)), new KeyFrame(new Duration(
                                            800), new EventHandler<ActionEvent>() {
                                                @Override
                                                public void handle(ActionEvent t) {
     
                                                    getChildren().remove(0); // remove the displayed screen
                                                    getChildren().add(0, screens.get(name).getKey()); // add the
                                                    // screen
                                                    Timeline fadeIn = new Timeline(new KeyFrame(
                                                                    Duration.ZERO, new KeyValue(opacity, 0.0)),
                                                            new KeyFrame(new Duration(800), new KeyValue(
                                                                            opacity, 1.0)));
                                                    fadeIn.play();
     
                                                }
                                            }, new KeyValue(opacity, 0.0)));
                    fade.play();
     
                } else {
                    setOpacity(0.0);
     
                    getChildren().add(screens.get(name).getKey()); // no one else been
                    // displayed, then just
                    // show
                    Timeline fadeIn = new Timeline(new KeyFrame(Duration.ZERO,
                            new KeyValue(opacity, 0.0)), new KeyFrame(new Duration(
                                            2500), new KeyValue(opacity, 1.0)));
                    fadeIn.play();
                }
                return true;
            } else {
                System.out.println("screen hasn't been loaded!!! \n");
                return false;
            }
        }
    }

    Maintenant dans MyControllerFenetrePrincipale, on va gérer le passage dans le didacticiel #1 en remplaçant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    @FXML
    	public void goToScreenTuto1(ActionEvent event) {
     
    		myController.setScreen(Main.TUTO1_SCREEN);
    		Main.test1.setIsTuto1(true);
     
     
    	}
    Par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
        private final List<Service> runningTutorials = new LinkedList();
     
        @FXML
        public void goToScreenTuto1(ActionEvent event) {
     
            myController.setScreen(Main.TUTO1_SCREEN);
            Service<Void> tutorial = new Service<Void>() {
     
                @Override
                protected Task<Void> createTask() {
                    final MyControllerFenetreTuto1 tuto1Controller = (MyControllerFenetreTuto1) myController.getScreen(Main.TUTO1_SCREEN).getValue();
                    return new Tuto1Task(tuto1Controller);
                }
            };
            tutorial.setOnSucceeded(workerStateEvent -> {
                // Faire des trucs si ça marche.
                runningTutorials.remove(tutorial);
            });
            tutorial.setOnCancelled(workerStateEvent -> {
                // Faire des trucs si on annule.
                runningTutorials.remove(tutorial);
            });
            tutorial.setOnFailed(workerStateEvent -> {
                // Faire des truc si ça se vautre.
                runningTutorials.remove(tutorial);
            });
            runningTutorials.add(tutorial);
            tutorial.start();
        }
    Et voici le squelette de la tâche qui remplace la classe Gestes (vu que je n'ai pas le code pour compiler telle qu'elle l'autre classe, j'avais du tout désactiver ou presque) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    public class Tuto1Task extends Task<Void> {
     
        private MyControllerFenetreTuto1 tuto;
     
        public Tuto1Task(MyControllerFenetreTuto1 tuto) {
            this.tuto = tuto;
        }
     
        @Override
        protected Void call() throws Exception {
            updateMessage("démarrage");
            while (!isCancelled()) {
                // Do stuff.
                showButton();
                if (isCancelled()) {
                    return null;
                }
                updateMessage("attente");
                Thread.sleep(20);
                updateMessage("redémarrage");
            }
            return null;
        }
     
        private void showButton() {
            Platform.runLater(() -> tuto.btnVisible());
        }
    }
    Ici c'est la classe MyScreenController qui monte manuellement la tâche et lui fourni le contrôleur du tuto1. On aurait aussi pu faire que la tache soit intégralement gérée (instanciée, lancée, gérée au niveau des sorties et des erreurs) directement dans le contrôleur du tuto1.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  2. #22
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 14
    Points : 3
    Points
    3
    Par défaut
    Je ne t'ai pas mis tout mon code mais bien le probleme que j'ai. Parce que c'est en cliquant sur tutoriel dans la fenêtre principale que ça lancait le Thread de ma classe Gestes. Je me suis dit que c'était plus clair avec ça.
    Oui c'est vrai que je n'ai pas préciser que j'était debutant ... Desoler.
    J'ai mis plusieurs fois relocate() parce que mes différents anchorpane n'ont pas les mêmes dimensions et je voulais avoir la fenetre en plein écran avec mon anchorpane centrer au milieu. Je l'ai donc fait manuellement !
    Les constantes correspondent aux dimensions de mes anchorpanes !
    Au départ je ne l'avais pas déclarer static mais j'avais une erreur et eclipse me disait de le declarer static..
    Je vais essayer ce que tu as mis !
    Merci encore pour ton aide et je m'excuse de te prendre autant de temps pour quelque chose qui aurai pu être regler rapidement si j'avais etre plus clair dans mes propos !

  3. #23
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    AnchorPane s'utilise avec des contraintes placées sur ses contrôles enfant via appels des méthodes statiques AnchorPane.setLeftAnchor(), etc. StackPane met automatiquement le contenu au centre (et le redimensionne quand le contenu est redimensionnement, etc). A aucun moment il n'y a besoin des faire des relocate() manuellement. Surtout que :

    1. Ca ne s'applique pas forcément à toutes les tailles d'écran (sur mon portable tout était en dehors de la zone d'affichage).
    2. Tout ce genre de positionnement ne sert à rien si on en vient à redimensionner la fenêtre (et soit dit en passant il y a d'autres méthodes pour mettre une fenêtre en plein écran et changer la taille de la scène ne tient pas compte de la taille des bordures des décorations de la fenêtre).
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  4. #24
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 14
    Points : 3
    Points
    3
    Par défaut
    D'accord ! Merci pour l'info je changerai ça !

Discussions similaires

  1. Liaison entre classes ?
    Par zpico dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 22/02/2012, 14h55
  2. Syntaxe - liaisons entre classe
    Par 10say dans le forum UML
    Réponses: 4
    Dernier message: 31/08/2011, 14h14
  3. Réponses: 2
    Dernier message: 25/08/2010, 15h17
  4. Pas de liaisons entre classes dans un diagramme des classes
    Par zoom35 dans le forum Diagrammes de Classes
    Réponses: 3
    Dernier message: 26/06/2008, 15h40
  5. [AS2] liaison entre classe et symbole
    Par ooyeah dans le forum ActionScript 1 & ActionScript 2
    Réponses: 1
    Dernier message: 04/07/2005, 09h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo