MFF

    Minecraft Forge France
    • Récent
    • Mots-clés
    • Populaire
    • Utilisateurs
    • Groupes
    • Forge Events
      • Automatique
      • Foncé
      • Clair
    • S'inscrire
    • Se connecter

    Un petit projet dans le but de maîtriser la bête… java?

    Planifier Épinglé Verrouillé Déplacé Le salon informatique
    software
    16 Messages 5 Publieurs 655 Vues 1 Watching
    Charger plus de messages
    • Du plus ancien au plus récent
    • Du plus récent au plus ancien
    • Les plus votés
    Répondre
    • Répondre à l'aide d'un nouveau sujet
    Se connecter pour répondre
    Ce sujet a été supprimé. Seuls les utilisateurs avec les droits d'administration peuvent le voir.
    • T Hors-ligne
      totos51
      dernière édition par

      Salut tout le monde,

      A la suite d’une idée et principalement de la volonté d’améliorer mon niveau en java qui est pour moi bien insuffisant, j’avais demandé de l’aide le long d’un projet personnel me permettant de maîtriser les bases. On m’a a quelques reprises conseillé des TP mais au final, je me suis obstiné sur mon idée et j’ai obtenu de l’aide de 2 personnes: Blackout et gagoi, je tiens d’ailleurs tout particulièrement à remercier Blackout qui m’a aidé à comprendre et utilisé de nombreuses notions en me conseillant par de longs pavés remplis d’explications simples mais ô combien bénéfique.

      Aujourd’hui je souhaite mettre mon idée à la vue de tous, afin de pouvoir recevoir des critiques de tout le monde afin de considérablement m’améliorer, je demanderai simplement à ceux qui souhaitent m’aider de garder un minimum de respect et d’éviter de me lapider si je fais des fautes qui vous sembles trop inacceptable. Non sérieusement, s’il vous plait, ayez un peu de pitié, les caillous ça fait mal…

      #Une petite présentation de mon idée(Une petite présentation de mon idée)

      Mon projet a pour but d’aider une amie (en l’occurrence ma belle sœur :P), à améliorer son niveau en mathématiques. Cette dernière ayant quelques difficultés au niveau troisième (glandeuse), je compte donc faire un petit programme qui proposera diverses exercice générés aléatoirement avec la possibilité de voir la correction.

      Les idées actuelles d’exercices sont les suivantes, c’est à dire que j’ai déjà commencé à travailler plus ou moins succinctement dessus:

      1. Du calcul mental avec un score basé sur le temps de réponse moyen
      2. un générateur d’équation du premier degrés à une inconnue
      3. un générateur de système d’équation à 2 inconnues
      4. un générateur de polynôme du second degrés

      les fonctionnalités que j’aimerais pouvoir ajouter, c’est à dire que l’idée est la mais que le travail n’est même pas sous forme d’ébauche:

      • La possibilité d’afficher une correction avec le développement entier du calcul
      • la possibilité d’ouvrir un cours se résumant en une image sur une fenetre à part
      • la possibilité de lier les scores sur une base de données afin de comparer les scores
      • l’ajout d’exercices, principalement sur les dérivés, la trigonométrie et d’autres cours de 1ere S

      #Dernières remarques(Dernières remarques)

      A ceux qui souhaite m’aider, n’oubliez pas que je cherche à m’améliorer, je ne souhaite donc pas avoir du code pré-mâché, je souhaite des remarques sur la structure de mon code, ma façon d’organiser mon code. Je souhaite également savoir comment je pourrais optimiser, raccourcir, simplifier mon code. La meilleure façon est je pense que vous copiez simplement le bout de code correspondant en m’expliquant ce qui ne va pas. Comme je l’ai déjà dis, je ne veux pas du travail pré-mâché et souhaite simplement des conseils, des pistes pour avancer non pas de façon sinueuse (en faisant du code moche pour les yeux) mais de façon droite avec un code propre.

      #Pourquoi ne pas avoir suivis des TP tout fait?(Pourquoi ne pas avoir suivis des TP tout fait?)

      Il faut savoir que je programme par plaisir à l’heure actuelle, mais que programmer des trucs n’ayant pas d’intérêt directe pour moi n’est pas je trouve suffisamment motivant. Dans le sens où, quand on fait un mod par exemple, on compte s’en servir, on est motivé par la volonté de faire le mod, on sait que le résultat final nous servira et aura plus d’importance pour nous encore du fait qu’il vienne entièrement de notre imagination. Ici un tp n’est pour moi pas quelque chose de suffisamment motivant à mes yeux.

      #Pourquoi ne pas continuer par mp et skype comme je faisais?(Pourquoi ne pas continuer par mp et skype comme je faisais?)

      Tout simplement afin que les remarques que l’on me fait puisse profiter à tous.

      #Le plus important, le code?(Le plus important, le code?)

      Le voici, le voila, sur github: https://github.com/gr3gory/GregIsLearningYouMath
      Au passage je ne maîtrise pas forcement bien git et github, si quelqu’un pourrait me dire s’il connait un tuto afin de mieux cerner (travailler à plusieurs etc).

      Sur ce, je vous souhaite une bonne journée et espère des réponses enrichissantes 🙂
      Merci de votre attention.

      1 réponse Dernière réponse Répondre Citer 0
      • RedRelayR Hors-ligne
        RedRelay Moddeurs confirmés
        dernière édition par

        Bon du coups, je vais faire mes remarques sur l’interface graphique ici, comme ça, ça profitera a tous.

        Fenetre.java :

        Tu n’as pas besoin de garder tout tes JMenu en attibut.
        En fait, la tout tes attributs sont inutile.

        Il faut que tu les déclares dans le constructeur de ta fenetre, que tu leur ajoute les actionsListeners nécessaire.
        Et enfin que tu les ajoutes a ta JFrame.

        le “this.setSize(400, 400);” -> très mauvais.

        Généralement a la fin du contructeur on fait :

        
        this.pack(); // Donne une dimension idéale a la fenêtre
        this.setLocationRelativeTo(null) ; //Centre la fenetre
        this.setVisible(true); // Affiche la fenetre
        
        

        Ta fonction switchPanel ne sert a rien.
        Elle est en public, ce qui signifie qu’elle pourra être appeler a partir d’un autre fichier.
        Je ne vois pas a partir de quel autre fichier tu pourait lui fournir des paramètres valide.

        Dans tes ActionListeners, fait plutôt par exemple :

        
        this.equation.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent arg0){Fenetre.this.setContentPane(new EquationPanel(Fenetre.this));}});
        
        

        Tu ne peux pas utiliser this tout seul dans ce cas la, car this désigne l’ActionListener.
        Pour obtenir la classe “externe” (->outerclass en anglais), tu utilises Fenetre.this 😉
        D’ailleur, il n’est pas commun de passer l’instance de la fenêtre en paramètre d’un JPanel, donc il va surement y avoir moyen de modifier ça 😉

        MenuPanel.java :
        Ici les noms des fonctions sont mal choisit.
        setFrameLayout ne définit pas le Layout de la Frame mais du Panel.
        Et elle y ajoute des composants.
        Par defaut en Java, tu es en BorderLayout, donc pas besoin de faire un setLayout.
        Ta fonction setFrameLayout est en public et peut donc être appeler de n’importe quel autre fichier. Est-ce utile ?
        Selon moi, rien ne sert de garder cette fonction.
        Place son contenu dans le constructeur;

        EquationPanel.java :

        Beaucoups de chose a dire sur cette classe.
        Et comme je l’avais prévu, la référence vers la Frame ne sert a rien 😉
        Idem, les fonctions sont très mal nommé.
        Idem, pas besoin de garder les boutons en attribut.

        Ça ne sert a rien de faire un frame.setVisible(true), elle sera déjà visible une fois pour toutes dans le constructeur.

        Ton layoutManager doit être fixé dans le constructeur;
        Ici tu supprime ajoute des composant graphique dès que tu changes quelque chose sur l’ecran. Pourquoi ne pas fermer entièrement l’application et tout recommencer de 0 pour avoir afficher une nouvelle équation ? joke.
        Tu dois placer tout tes composants dans le constructeur et ne garder en attribut que ce qui est capable de changer.
        Celui qui affiche l’équation par exemple 😉 Pas de chance, c’est le seul que tu ne garde pas x)

        Le GridLayout(10,1), tu ne trouves pas que c’est un peu crade ? 😉
        Si je comprend bien, tu affiches une équation et en dessous 2 boutons : generate et correct.
        Tu n’a aucun champs pour entrer la réponse 😕
        Ce que je te propose, pour ne pas utiliser un GridBagLayout (Qui fait très peur au début mais qui est très customisable et très simple d’utilisation une fois qu’on a comprit son fonctionnement), c’est de procéder comme il suit :
        Utilises un BorderLayout :

        • Au Centre : un JPanel A
        • Au Sud : un JPanel B
          Pour le JPanel A, tu utilises un BorderLayout :
        • Au Nord : un JLabel qui prendre comme valeur ton équation -> Mémorise le en attribut
        • Au Centre : un JPanel C
          Pour le JPanel C, utilises un BoxLayout(JPanel C, BoxLayout.Y_AXIS) :
          Pour chaque inconu tu ajoute un JTextFieldWithLabel : une classe que tu vas devoir créer.

        JTextfieldWidthLabel extends JPanel : BorderLayout
        Ouest : JLabel (l’inconu)
        Est : JTextfield (la réponse)

        On revient au JPanel B : FlowLayout
        Tu places le bouton correct et generate.

        –-- Voila pour le placement des composants ----

        La fonction update() ne veux rien dire.
        C’est plutôt une fonction setEquation(Equation e) qu’il te faudrait.
        Dans ton button qui génère l’équation, tu fais un setEquation(new Equation());
        setEquation devra faire un Jlabel.setText(e.toString()) pour afficher l’équation.

        Je m’arrête la pour le moment, il y a encore beaucoup a dire.
        Mais tu peux déjà te lancer dans une amélioration de ton code assez lourde de changement 😉

        –------------------------------------------------------------------------------------
        Si tu trouves mon intervention pertinente, n'hésite pas a m…

        1 réponse Dernière réponse Répondre Citer 1
        • T Hors-ligne
          totos51
          dernière édition par

          Rah ça me manquait les jolies pavés! bon bah oui j’ai du boulot :3
          j’avoue que l’interface graphique, ma première réaction a été: euh ouais, par ou je commence? ^^’
          Bon bah let’s go 😄

          –-----
          Tout d’abord, modification de EquationPanel() (bah oui pck la modification de son constructeur et plus précisément des paramètres qu’il prend modifie Fenetre.java) En effet le setVisible(true) ne sert à rien mais c’était le seul moyen que j’avais trouvé pour mettre à jour l’affichage.

          En ce qui concerne le fait qu’il n’y ait pas de champ de réponse, mon raisonnement est le suivant: SI j’en fais un pour celle la je devrais en faire un pour les autres, or je vois difficilement comment je vais en mettre un pour le polynome par exemple ^^'. Donc je me suis dit qu’il vallait mieux que je préfère simplement afficher les réponses afin de comparer avec ses résultats.

          En fait le GridBagLayout on transforme notre composant en un tableau et on place les composants dans les cases voulut grâce aux coordonnées?
          “Le GridLayout(10,1), tu ne trouves pas que c’est un peu crade ?” mon but était d’avoir deux lignes au centre assez proche l’une de l’autre, comment aurais je pus faire avec d’autres layout?

          En suivant openclassroom:
          //On définit le layout en lui indiquant qu’il travaillera en ligne
          b1.setLayout(new BoxLayout(b1, BoxLayout.LINE_AXIS));
          ici on utilise Y_AXIS, donc il travaille en fonction de la coordonnée Y? c’est à dire?

          Durant mes tests, ma fenetre ce bloque parfois quand j’appuis sur le bouton de generation, m’obligeant à interrompre depuis la console eclipse, à quoi cela pourrait il être dus?

          Voila j’ai je pense appliquer tout ce que tu m’as dis du mieux que je peux ou du moins du mieux que j’ai compris 🙂
          Cependant je me heurte de ce fait à plusieurs soucis:

          • Quand je clique sur equation (pour afficher l’exercice sur l’équation), rien ne se passe et le menu disparait seulement, qu’ai je oublier? comment mettre à jour l’affichage?
          • mon texte du menuPanel ne rentre plus dans le cadre (logique ^^)

          Sans vouloir m’avancer: “Par defaut en Java, tu es en BorderLayout, donc pas besoin de faire un setLayout.” n’est valable que si je suis extends JFrame non? MenuPanel est… un Panel ^^’ et il semble obéir à un FlowLayout

          1 réponse Dernière réponse Répondre Citer 0
          • utyboU Hors-ligne
            utybo
            dernière édition par

            En effet TOUTES les frames utilisentuun flow layout par défaut. À moins que le layout soit précisé autre part, je ne vois pas pourquoi le layout ne serait pas un flow layout blackout 🙂

            Moddeur à la retraite et développeur de trucs en Java.

            J'aide les gens comme je peux, alors si mon message v…

            1 réponse Dernière réponse Répondre Citer 0
            • RedRelayR Hors-ligne
              RedRelay Moddeurs confirmés
              dernière édition par

              Les Frames utilisent TOUTES un BorderLayout par défaut.
              Les JPanels sont en revanche initialisé en FlowLayout. Donc oui en effet, tu dois garder ton setLayout ^^
              Ton setFrame m’a embrouillé 😛

              @utybo : impossible de déchiffrer ta dernière phrase dsl 😕 C’est pas français 😕

              –------------------------------------------------------------------------------------
              Si tu trouves mon intervention pertinente, n'hésite pas a m…

              1 réponse Dernière réponse Répondre Citer 0
              • T Hors-ligne
                totos51
                dernière édition par

                Mais du coup est ce que je dois laisser le setvisible(True) pour que l’affichage soit mis à jour?

                Edit, en m’inspirant de code que j’ai trouvé j’ai ajouté: Fenetre.this.revalidate(); dans mes action listener, et cela fonctionne.
                est ce la bonne solution?

                je remets sur le tapis cette question: Durant mes tests, ma fenetre ce bloque parfois quand j’appuis sur le bouton de generation, m’obligeant à interrompre depuis la console eclipse, à quoi cela pourrait il être dus?
                je ne trouve pas.

                1 réponse Dernière réponse Répondre Citer 0
                • ÜberfapÜ Hors-ligne
                  Überfap
                  dernière édition par

                  Essaie de mettre ce qu’il y a dans l’action listener du bouton de génération dans un thread a part, si le GUI plante c’est à cause de l’EDT 😉

                  Si je t'ai aidé, n'hésites pas à mettre un point de réputation positif !
                  Si tu m'as aidé, je n'hésiterais pas à t'en donner à mon tour !

                  1 réponse Dernière réponse Répondre Citer 0
                  • utyboU Hors-ligne
                    utybo
                    dernière édition par

                    Désolé Blackout, la fatigue a eu raison de moi ><

                    Moddeur à la retraite et développeur de trucs en Java.

                    J'aide les gens comme je peux, alors si mon message v…

                    1 réponse Dernière réponse Répondre Citer 0
                    • RedRelayR Hors-ligne
                      RedRelay Moddeurs confirmés
                      dernière édition par

                      @‘AlphaSwittleTeam’:

                      Essaie de mettre ce qu’il y a dans l’action listener du bouton de génération dans un thread a part, si le GUI plante c’est à cause de l’EDT 😉

                      Surtout pas. setEquation va modifier l’affichage et il ne faut jamais modifier l’affichage depuis un autre thread. Ça créé des instabilité.

                      Non c’est étrange que ta fonction setEquation() prenne aussi beaucoup de temps.
                      Essaye de touver qu’est ce qui peut prendre du temps.

                      Rien a voir avec ce problème mais dans ta classe Equation, dans le toString, tu fais un new String(), ça ne sert a rien pour ce que tu t’en sert mis a part instancier 2 chaines identiques.

                      le new String() on s’en sert presque jamais.
                      Quand tu fais new String(String a), la JVM créé la String a et la passe en parametre au constructeur de la classe String pour te donner quelque chose que tu as déjà.

                      –------------------------------------------------------------------------------------
                      Si tu trouves mon intervention pertinente, n'hésite pas a m…

                      1 réponse Dernière réponse Répondre Citer 0
                      • jglrxavpokJ Hors-ligne
                        jglrxavpok Modérateurs
                        dernière édition par

                        Tu peux toujours envoyer un message à l’EDT pour rafraîchir la fenêtre, ça devrait mieux marcher.

                        @http://docs.oracle.com/javase/tutorial/uiswing/concurrency/dispatch.html:

                        It’s useful to think of the code running on the event dispatch thread as a series of short tasks. Most tasks are invocations of event-handling methods, such as ActionListener.actionPerformed. Other tasks can be scheduled by application code, using invokeLater or invokeAndWait. Tasks on the event dispatch thread must finish quickly; if they don’t, unhandled events back up and the user interface becomes unresponsive.

                        Il faut donc utiliser SwingUtilities.invokeLater(…) pour envoyer un message (tu peux modifier ta fenêtre à l’intérieur de celui-ci)

                        Modérateur sur MFF. 
                        Mon Github: http://github.com/jglrxavpok
                        Mon compte Steam si vous voulez jouer à CS:GO ou TF2 avec moi: https://steamcommunity.com/id/jglrxavpok/

                        1 réponse Dernière réponse Répondre Citer 1
                        • RedRelayR Hors-ligne
                          RedRelay Moddeurs confirmés
                          dernière édition par

                          Ouais mais ne te complique pas la vie avec ça.
                          C’est une fausse solution, puisque normalement tu n’as pas besoin d’une grosse force de calcul pour générer une équation.
                          Tu as un truc qui consome trop pour ce que tu fais, il faut que tu trouve c’est quoi.

                          –------------------------------------------------------------------------------------
                          Si tu trouves mon intervention pertinente, n'hésite pas a m…

                          1 réponse Dernière réponse Répondre Citer 0
                          • ÜberfapÜ Hors-ligne
                            Überfap
                            dernière édition par

                            Ah oui excuse moi, je ne voulais pas dire un autre thread mais plutôt un Swing Worker 😉

                            Si je t'ai aidé, n'hésites pas à mettre un point de réputation positif !
                            Si tu m'as aidé, je n'hésiterais pas à t'en donner à mon tour !

                            1 réponse Dernière réponse Répondre Citer 0
                            • T Hors-ligne
                              totos51
                              dernière édition par

                              J’ai beau cherché selon ta piste Blackout, je ne vois pas ce qui peut trop consommer, mon équation peut difficilement bouffer moins si?

                              
                              public Equation(int nbrInconnue)
                              {
                              this.inconnu = nbrInconnue;
                              this.a = ((int) (Math.random()*10) + 1);
                              this.c = ((int) (Math.random()*10) + 1);
                              this.b = ((int) (Math.random()*10) + 1);
                              if (Math.random() >= 0.5)
                              this.a = (-1 * this.a);
                              if (Math.random() >= 0.5)
                              this.c = (-1 * this.c);
                              if (Math.random() >= 0.5)
                              this.b = (-1 * this.b);
                              }
                              
                              

                              et mon action listener porte sur ça:

                              
                              public void setEquation(Equation e)
                              {
                              this.answer.setText("X = ");
                              this.equation = e;
                              this.textEquation.setText(e.toString());
                              }
                              
                              

                              je vois pas où peut être le soucis en fait… La répétition de Math.random?

                              Sinon, en utilisant comme tu m’as dis this.pack(); je me retrouve à avoir les 2 premiers mots de mon JEditorPane et tout le reste en dehors des marges. J’ai pensé à setMargins() ou setBounds() mais cela ne fonctionne en rien, comment afficher tout un texte? dansd l’idée, mise en page automatique avec marge à droite?
                              Egalement avec this.pack quand je vais sur ma fenetre équation, un seul des 2 boutons devient visible, l’autre étant trop à droite de la fenetre.

                              1 réponse Dernière réponse Répondre Citer 0
                              • T Hors-ligne
                                totos51
                                dernière édition par

                                Finalement, je n’ai pas utilisé de BoxLayout, je ne parvenais pas à centrer mes objets dans ma fenêtre automatiquement, j’ai donc utilisé un flowLayout.
                                PAreillement pour le this.pack, j’ai préféré utilisé un this.setsize tout simplement pck le this.pack bouffer une bonne partie de ma fenetre et me cacher les composant (les élements de la fenetre équation étaient hors-champs)

                                en ce qui concerne le problème précédent:
                                this.textEquation.setText(e.toString());

                                le soucis venez de cette ligne, en effet la fonction toString demander à ce que la fonction soit simplifier, hors la fonction simplifier était trop lourde puisqu’elle essayais de simplifier la fraction part tout les nombres compris entre 2 et max(numerateur, denominateur). j’ai modifié en prenant les nombres compris entre 0 et racine carré de (max(numerateur, denominateur)+10)

                                Je vais donc commencer la suite 🙂

                                Laissez moi vos commentaires! 🙂

                                1 réponse Dernière réponse Répondre Citer 0
                                • RedRelayR Hors-ligne
                                  RedRelay Moddeurs confirmés
                                  dernière édition par

                                  Gardes le pack(), utilise setPreferredSize() sur tes composants pour fixer la taille idéale.
                                  Ensuite tu utilise SwingUtilities pour remonter l’arborescence et appeler la methode pack().

                                  Le problème du flowlayout apparaitra lorsque tu va gérer les entrés d’équation a inconnu multiple.
                                  Mais en attendant, tu peux le garder si tu veux.

                                  –------------------------------------------------------------------------------------
                                  Si tu trouves mon intervention pertinente, n'hésite pas a m…

                                  1 réponse Dernière réponse Répondre Citer 0
                                  • T Hors-ligne
                                    totos51
                                    dernière édition par

                                    Un petit up pour dire que je m’y remets un peu, que je re-avance doucement pour essayer de finir, je pense pas que cela soit vraiment nouveau, j’essaie juste d’appliquer au mieux les remarques précédentes.

                                    • Je me suis attaqué au gridbagLayout, en fait c’est assez long, mais ça fonctionne plutôt bien, même avec une petite échelle comme ça on constate nettement la difference.

                                    Maintenant va falloir gérer les exceptions et les quelques problème pour les fractions, pour pas que -10/-5 != 2 ^^’

                                    Edit: les exceptions et les petits soucis de fractions sont régles, c’était surtout longs en fait, j’aimerai votre avis sur le dernier commit, principalement la méthode equals(String) de la classe Fraction.

                                    Ps: Comment depuis github on envoie un lien pointant vers une partie de fichier seulement, fin qui est orienté vers cette partie de fichier?

                                    1 réponse Dernière réponse Répondre Citer 0
                                    • 1 / 1
                                    • Premier message
                                      Dernier message
                                    Design by Woryk
                                    ContactMentions Légales

                                    MINECRAFT FORGE FRANCE © 2024

                                    Powered by NodeBB