Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème placement interface+optimisation code

Sujet résolu
    13 novembre 2014 à 22:34:28

    Bonjour à tous,

    je me tourne vers vous amis codeurs car je n'arrive pas à régler un problème :)

    Alors c'est un (moyen/)gros projet java que l'on doit faire en TP. C'est un simulateur de circuits logiques.

    Le TP est divisé en 2 parties, la première porte sur le simulateur en lui même (qui fonctionne parfaitement)

    et l'autre partie c'est la création de l'interface de ce simulateur. J'ai pioché quelques idées à droite à gauche sur internet mais là je bloque.

    Je suis débutant en java donc j'ai encore des lacunes

    Voici ce que je devrais obtenir (oui le prof fait des fautes :waw: )

    http://sdz-upload.s3.amazonaws.com/prod/upload/149.JPG

    http://sdz-upload.s3.amazonaws.com/prod/upload/228.JPG

    Pour créer cette fenêtre j'ai utilisé 2 class, une qui créer l'interface et l'autre qui la lance. Voici les codes respectifs

    Le lanceur fonctionne très bien

    import javax.swing.SwingUtilities;
    
     
    public class Lanceur
    {
        public static void main(String[] args){
    		SwingUtilities.invokeLater(new Runnable(){
    			public void run()
    			{
    				MonInterface inter = new MonInterface();
    				inter.setVisible(true);
    			}
    		});
    	}
    }
    



    Pour les layout je ne sais pas lesquelles utiliser, j'en ai essayé plein. La méthode pour créer les radiobutton ne doit pas être optimale x) mais pour pouvoir leur définir une action dans actionPerformed, il fallait que je les initialise en haut. Et le println est juste là pour vérifier que les boutons fonctionnent. 

    Pour l'instant , je ne m'occupe pas de la dernière ligne  avec le boutton "Pas" et "Ras"et de l'action du radiobutton "X"

    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JButton;
    import javax.swing.JLabel;
    import javax.swing.ButtonGroup;
    import javax.swing.JRadioButton;
    
    import java.awt.GridLayout;
    import java.awt.FlowLayout;
    import java.awt.Color;
    
    import java.awt.event.ActionListener;
    import java.awt.event.ActionEvent;
    
    
    public class MonInterface extends JFrame implements ActionListener
    {
        
         
        public int return_b, return_b2;
        public JRadioButton boutonradio1, boutonradio2, boutonradiox, boutonradio10, boutonradio20, boutonradiox0;
        
        public MonInterface()
        {
            super();
            build(); //on initialise notre fenêtre
        }    
        
        private void build()
        {
         
            setTitle("Simulateur de Circuits Logiques");
            setSize(450,200);
            setLocationRelativeTo(null);
            setResizable(false);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setContentPane(buildContentPane());
           
            
           
            
        }
    
        
        private JPanel buildContentPane()
        {
            JPanel panel = new JPanel();
            //panel.setBackground(Color.orange);
            panel.setLayout(new FlowLayout());
            JLabel label = new JLabel("Entrée 1:                ");
            JLabel label2 = new JLabel("Entrée 2:                ");
            panel.add(label);
            panel.add(label2);
            
            //création des radios boutons
            boutonradio1 = new JRadioButton("1");
            boutonradio2 = new JRadioButton("2");
            boutonradiox = new JRadioButton("X");
            
            
            boutonradio10 = new JRadioButton("1");
            boutonradio20 = new JRadioButton("2");
            boutonradiox0 = new JRadioButton("X");
            
            
            //Grouper les boutons
            ButtonGroup groupe = new ButtonGroup();
            groupe.add(boutonradio1);
            groupe.add(boutonradio2);
            groupe.add(boutonradiox);
            groupe.add(boutonradio10);
            groupe.add(boutonradio20);
            groupe.add(boutonradiox0);
            
             //Action listener des boutons
            boutonradio1.addActionListener(this);
            boutonradio2.addActionListener(this);
            boutonradiox.addActionListener(this);
            boutonradio10.addActionListener(this);
            boutonradio20.addActionListener(this);
            boutonradiox0.addActionListener(this);
            
            
            panel.add(boutonradio1);
            panel.add(boutonradio2);
            panel.add(boutonradiox);
            panel.add(boutonradio10);
            panel.add(boutonradio20);
            panel.add(boutonradiox0);
            
            
           
            return panel;
       
        }
        
        public void actionPerformed(ActionEvent e)
        {
         if (e.getSource() == boutonradio1)
         {
           return_b=1; 
           System.out.println("Valeur Entrée 1= " + return_b);
         }
         else if (e.getSource() == boutonradio2)
         {
           return_b=2;
           System.out.println("Valeur Entrée 1= " + return_b);
         }
         
         
         
          if (e.getSource() == boutonradio10)
         {
           return_b2=1; 
           System.out.println("Valeur Entrée 2= " + return_b2);
         }
         else if (e.getSource() == boutonradio20)
         {
           return_b2=2;
           System.out.println("Valeur Entrée 2= " + return_b2);
         }
           
         
        }
      
       
    }
    



    J'espère que vous pourrez m'aider ;)

    -
    Edité par Romain H. 13 novembre 2014 à 23:15:46

    • Partager sur Facebook
    • Partager sur Twitter
      16 novembre 2014 à 11:09:35

      Salut !

      Hum !! Windows XP !! :p

      Pour les layout, oui il y en a pas mal ^^ . J'utilise beaucoup BorderLayout, il permet de placer les composants sur les bords. Avec celui-ci il est plus simple d'insérer dans les bords des JPanel, eux-mêmes équipés de layout, ça permet de placer les composants en "zones" (boutons du bas, checkbox du milieu, bouton du haut...). Une classe qui extends JPanel dans laquelle tu mettras tes composants rendra mieux au niveau du code (plus clair). L'inconvénient est que tu es obligé de mettre un seul composant par bord (d'où l'intérêt des JPanel).

      Aussi, tu as le GridBagLayout qui est plus complexe mais qui permet de saisir des dimensions différentes pour chacun des éléments. C'est vraiment pratique pour les formulaires et les interfaces graphiques nécessitant de la précision. L'inconvénient c'est que tu dois saisir ces informations de placement pour tous les composants, sinon ils auront des tailles différentes.

      Tu as a enfin le SpringLayout, beaucoup plus simple et très pratique pour les petites interfaces. On peut placer des composants comme on le désire, leurs positions sont en coordonnées relatives, c'est-à-dire qu'ils se placent d'après leur distance par rapport aux autres composants et aux bords de l'application. Après, il faut savoir qu'il supporte mal les interfaces complexes avec de multiples layouts, car les objets ont tendance à se chevaucher. On peut régler ça, bien sûr, mais il serait préférable d'utiliser d'autres layout car c'est un travail assez fastidieux.

      Enfin, tu as l'option "sans layout". Tu définis ton layout sur null et tu places tes composants avec la méthode "setBounds()". C'est fortement déconseillé car peu adapté aux petites résolutions, car ça ne supporte pas le redimensionnement de la fenêtre. Malgré tout, on peut utiliser cette option pour de petites interfaces, comme des boîtes de dialogue simples pour éviter de se casser la tête.

      Pour cette dernière solution, si tu utilises Eclipse, tu as un module nommé WindowBuilder. Il reste simple d'utilisation et permet de tester ton GUI sans avoir à lancer ton programme. L'interface est claire et intuitive, mais il ne gère pas très bien les layouts. A utiliser avec modération donc ! :)

      La documentation d'Oracle offre pas mal de tutoriels et de conseils, c'est vraiment bien fait. Évidemment, c'est anglophone :p

      Voilà, j'espère avoir réussi à te guider, si tu as d'autres questions, n'hésites pas.

      • Partager sur Facebook
      • Partager sur Twitter
      Error 2006, MySQL server has gone away
        16 novembre 2014 à 15:34:18

        Je te remercie pour ton aide, finalement j'ai opté pour le GridBagLayout, un pote m'a montré comment ça fonctionnait. Le texte de TP à été fait l'année dernière et on avait XP mais depuis cette année on a Windows 7 ;)

        Je te montrerai le code que j'ai fait quand il sera mieux organisé et plus complet :D

        Yep j'ai une autre question, tu parles de multiples Layout, au début je pensais faire comme ça mais j'ai rien trouvé sur internet. Bien sûr je reste avec le layout cité plus haut, c'est juste pour la culture générale.

        • Partager sur Facebook
        • Partager sur Twitter
          16 novembre 2014 à 19:13:16

          Rien ne t'empêche d'utiliser plusieurs layout aussi :) . Il suffit juste de mettre un JPanel ou un autre composant qui supporte les layouts.

          Je te donne un exemple :

          public class Window extends JFrame{
              
              //...
              
              public Window(Component parent){
                  this.panel = new JPanel();
                  this.panel.setLayout(new BorderLayout());
                  JLabel content = new JLabel("Salut");
                  this.panel.add(content, BorderLayout.CENTER);
          
                  JPanel panel2 = new JPanel();
                  panel2.setLayout(new BorderLayout());
                  JButton okButton = new JButton("Ok"), closeButton = new JButton("Fermer");
                  panel2.add(okButton, BorderLayout.EAST);
                  panel2.add(closeButton, BorderLayout.WEST);
                  this.panel.add(panel2, BorderLayout.SOUTH);
          
                  this.setTitle("Test");
                  this.setContentPane(this.panel);
                  this.setModal(true);
                  this.setLocationRelativeTo(parent);
                  this.setVisible(true);
              }
          
              //...
          }
          Là tu as deux JPanel imbriqués, par conséquent, deux BorderLayouts imbriqués. Ça marche aussi avec d'autres layouts !



          • Partager sur Facebook
          • Partager sur Twitter
          Error 2006, MySQL server has gone away
            16 novembre 2014 à 21:45:04

            Merciiiiiiii !! je comprends bien maintenant ;)

            voici mon nouveau code:

            //importation de toutes les classes dont nous avons
            //besoin pour créer l'interface
            
            import javax.swing.JFrame;
            import javax.swing.JPanel;
            import javax.swing.JLabel;
            import javax.swing.JButton;
            import javax.swing.JRadioButton;
            import javax.swing.ButtonGroup;
            import javax.swing.BoxLayout;
            
            import java.awt.GridBagLayout;
            import java.awt.GridBagConstraints;
            import java.awt.Color;
            
            
            import java.awt.event.ActionListener;
            import java.awt.event.ActionEvent;
            
            
            public class MonInterface extends JFrame implements ActionListener
            {
                //initialisation des attributs.
                public char return_x,return_x2; 
                public int return_b, return_b2;
                public JRadioButton boutonradio1, boutonradio2, boutonradiox, boutonradio10, boutonradio20, boutonradiox0;
                public JButton pas, raz;
                public MonInterface()
                {
                    super();
                    build(); //on initialise notre fenêtre
                }    
                
                private void build()
                {
                 
                    setTitle("Simulateur de Circuits Logiques");//titre de la fenêtre
                    setSize(450,200);//fenêtre de taille 450px *200px
                    setLocationRelativeTo(null);
                    setResizable(false);//n'autorise pas l'agrandissement de la fenêtre
                    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//permet de fermer la fenêtre en appuyant sur la croix
                    setContentPane(buildContentPane());//ajouter le panel créé avec la méthode buildContentPane()
                   
                    
                   
                    
                }
            
                
                private JPanel buildContentPane()
                {
                    JPanel panel = new JPanel();
                    //panel.setBackground(Color.white);
                    
                    panel.setLayout(new GridBagLayout());                       //utilisation du GridBagLayout 
                    GridBagConstraints position = new GridBagConstraints();     //pour le positionnement des éléments
                    
                    //création de la 1ère ligne
                    //placement du label Entrée 1 en 0,0
                    position.gridx = 0;
                    position.gridy = 0;
                    JLabel label = new JLabel("Entrée 1: ");
                    panel.add(label,position);
                    
                    //placement du 1er radiobutton en 0,1
                    position.gridx = 1;
                    boutonradio1 = new JRadioButton("0");
                    panel.add(boutonradio1,position);
                    //placement du 2e radiobutton en 0,2
                    position.gridx = 2;
                    boutonradio2 = new JRadioButton("1");
                    panel.add(boutonradio2,position);
                    //placement du 3e radiobutton en 0,3
                    position.gridx = 3;
                    boutonradiox = new JRadioButton("X");
                    panel.add(boutonradiox,position);
                    //fin de la ligne
                    position.gridwidth = GridBagConstraints.REMAINDER;
                    
                    
                    //création de la 2e ligne
                    //placement du label Entrée 2 en 0,1
                    position.gridx = 0;
                    position.gridy = 1;
                    // 1 colonne de large
                    position.gridwidth = 1;
                    // 1 ligne de haut
                    position.gridheight = 1;
                    
                    
                    JLabel label2 = new JLabel("Entrée 2: ");
                    panel.add(label2,position);
                    
                    //placement du 4e radiobutton en 1,1
                    position.gridx = 1;
                    boutonradio10 = new JRadioButton("0");
                    panel.add(boutonradio10,position);
                    //placement du 5e radiobutton en 1,2 
                    position.gridx = 2;
                    boutonradio20 = new JRadioButton("1");
                    panel.add(boutonradio20,position);
                    //placement du 6e radiobutton en 1,3
                    position.gridx = 3;
                    boutonradiox0 = new JRadioButton("X");
                    panel.add(boutonradiox0,position);
                    //fin de la ligne
                    position.gridwidth = GridBagConstraints.REMAINDER;
                    
                    
                    //création de la 3e ligne
                    //Bouton "Pas" en 0,2       
                    position.gridx = 0;
                    position.gridy = 2;
                    // 1 colonne de large
                    position.gridwidth = 1;
                    // 1 ligne de haut
                    position.gridheight = 1;
                   
                    
                    pas = new JButton("Pas");
                    panel.add(pas,position);
                    
                    //Bouton "Raz" en 1,2
                    position.gridx = 1;
                    raz = new JButton("Raz");
                    panel.add(raz,position);
                    
                    //Placement du label en 2,2
                    position.gridx = 2;
                    JLabel sortie = new JLabel("   Résultat en sortie: ");
                    panel.add(sortie,position);
                    //fin de la ligne
                    position.gridwidth = GridBagConstraints.REMAINDER;
                
                    //Grouper les boutons
                    ButtonGroup groupe = new ButtonGroup();
                    groupe.add(boutonradio1);
                    groupe.add(boutonradio2);
                    groupe.add(boutonradiox);
                    groupe.add(boutonradio10);
                    groupe.add(boutonradio20);
                    groupe.add(boutonradiox0);
                    
                    //On atttribue la fonction Action aux boutons
                    boutonradio1.addActionListener(this);
                    boutonradio2.addActionListener(this);
                    boutonradiox.addActionListener(this);
                    boutonradio10.addActionListener(this);
                    boutonradio20.addActionListener(this);
                    boutonradiox0.addActionListener(this);
                    
                    return panel;
                    
                    
               
                }
                
                public void actionPerformed(ActionEvent e)
                {
                 if (e.getSource() == boutonradio1)
                 {
                   return_b=0; 
                   System.out.println("Valeur Entrée 1= " + return_b);
                 }
                 else if (e.getSource() == boutonradio2)
                 {
                   return_b=1;
                   System.out.println("Valeur Entrée 1= " + return_b);
                 }
                 else if (e.getSource() == boutonradiox)
                 {
                     return_x='X'; 
                   System.out.println("Valeur Entrée 1= " + return_x);
                    }
                 
                 
                  if (e.getSource() == boutonradio10)
                 {
                   return_b2=0; 
                   System.out.println("Valeur Entrée 2= " + return_b2);
                 }
                 else if (e.getSource() == boutonradio20)
                 {
                   return_b2=1;
                   System.out.println("Valeur Entrée 2= " + return_b2);
                 }
                 else if (e.getSource() == boutonradiox0)
                 {return_x2='X'; 
                   System.out.println("Valeur Entrée 1= " + return_x);
                    }  
                 
                }
            }
            

            Le prof nous a jamais expliqué le this. pourtant c'est quelque chose que l'on voit au début, tu peux m'expliquer ce que c'est ?

            PS: on travaille avec BlueJ :p

            -
            Edité par Romain H. 16 novembre 2014 à 21:58:05

            • Partager sur Facebook
            • Partager sur Twitter
              17 novembre 2014 à 8:25:22

              this désigne simplement la classe dans laquelle tu travailles. C'est comme si tu écrivais :

              objet.addActionListener(//...

              Sauf que tu remplaces la variable objet par "this". Pour moi, c'est un réflexe, dés que j'utilise une variable de classe ou des méthodes non statiques, j'utilise "this" : ça clarifie le code, tu peux utiliser une variable locale qui porte le même nom qu'un field, et on peut faire la différence entre les méthodes statiques et les autres. Etant donné que tu es à l'intérieur de la classe, les field te sont accessibles comme s'ils étaient en "public", tout comme les méthodes d'ailleurs, ce qui te permet d'utiliser this pour tout ;) .

              public class Clazz{
                  
                  private String name;
              
                  public Clazz(String name){
                      this.name = name;
                  }
                  
                  public Clazz getThis(){
                      return this;//La classe renvoie sa propre instance (inutile mais, c'est un exemple)
                  }
               }





              -
              Edité par EclipseOnFire 17 novembre 2014 à 8:28:30

              • Partager sur Facebook
              • Partager sur Twitter
              Error 2006, MySQL server has gone away
                17 novembre 2014 à 21:13:04

                Ok ;) Est-ce qu'on peut comparer un peu ça aux pointeurs * comme en C ?

                Sinon j'ai encore un problème, cette fois c'est au niveau de ActionPerformed

                Si tu reprends l'image dans mon 1er poste qui montre l'interface finale, à la fin des 3 lignes on a des labels avec l'intérieur qui est variable.

                Au début j'avais créé des label mais je n'arrivais pas écrire dedans donc je suis passer sur des jtextfields avec comme paramètres

                variable1.setEditable(false);
                variable1.getText();

                variable1 étant mon textfield

                Dans Actionperformed, j'ai donc ceci

                public void actionPerformed(ActionEvent e)
                    {
                     if (e.getSource() == boutonradio1)
                     {
                      
                       variable.setText("0-");
                     }
                     else if (e.getSource() == boutonradio2)
                     {
                       
                       variable.setText("1-");
                     }
                     else if (e.getSource() == boutonradiox)
                     {
                         variable.setText("X-");
                     }
                     
                     
                      if (e.getSource() == boutonradio10)
                     {
                       variable1.setText("0-");
                     }
                     else if (e.getSource() == boutonradio20)
                     {
                       variable1.setText("1-");
                     }
                     else if (e.getSource() == boutonradiox0)
                     {
                       variable1.setText("X-")
                     }  
                     
                     
                        
                     if (e.getSource() == raz)   
                     {
                     variable.setText("");
                     variable1.setText("");
                     }
                    }

                Or ce que j'écris n'est que du texte et non des variables et ce n'est pas ce que je veux. Ensuite je veux que par exemple j'ai cliqué sur le boutonradio0 et ensuite sur le boutonradio1 par exemple, ça m'affiche le résultat à suivre et non que ça le remplace, on doit obtenir ça=> 0-1-

                Et enfin j'ai rajouté un bouton raz qui remet les textfield à 0 mais je voudrais savoir si on peut faire de même avec des labels

                Pour résumer j'essaye de transformer les textfields en label

                • Partager sur Facebook
                • Partager sur Twitter
                  18 novembre 2014 à 18:59:53

                  Les pointeurs "*" ? Je ne connais pas bien le C, hormis les pointeurs sur la mémoire vive, je ne vois pas ^^ .

                  En ce qui concerne la comparaison d'objets, il est préférable d'utiliser la méthode générique "equals()". Elle fonctionne beaucoup mieux pour la comparaison de chaînes de caractères et certaines classes implémentent cette méthode pour se comparer plus précisément à d'autres classes.

                  Pour l'histoire des variables, si j'ai bien compris, tu veux afficher une variable à la place, ou en plus de ton texte ? Pour cela il suffit simplement de concaténer les chaînes de caractères de cette manière :

                  variable.setText("Bonjour, cher " + user.getName() + " !");

                  Avec user, une variable de type Utilisateur, contenant une méthode "getName()" renvoyant le nom de l'utilisateur en question (classe fictive).

                  Il faut également savoir que cette méthode de concaténation appelle tacitement la méthode "toString()" de l'objet :

                  System.out.println("Salut " + user.getName());
                  //Même chose que :
                  System.out.println("Salut " + user);

                  Si tenté que la méthode "toString()"  de notre classe Utilisateur renvoie le nom de l'utilisateur en question comme le ferait "getName()".

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Error 2006, MySQL server has gone away
                    24 novembre 2014 à 16:40:22

                    Désolé de ne pas t'avoir répondu plus tôt :/

                    J'ai utilisé la méthode equals() et ça fonctionne nickel, j'ai apporté quelques modifications par ci par là mais malheureusement il fallait rendre le projet et je n'ai pas eu le temps de tout finir. 

                    Merci beaucoup pour ton aide, tu m'as appris plein de choses en java :)

                    • Partager sur Facebook
                    • Partager sur Twitter
                      24 novembre 2014 à 16:49:47

                      EclipseOnFire a écrit:

                      Les pointeurs "*" ? Je ne connais pas bien le C, hormis les pointeurs sur la mémoire vive, je ne vois pas ^^ .

                      En ce qui concerne la comparaison d'objets, il est préférable d'utiliser la méthode générique "equals()". Elle fonctionne beaucoup mieux pour la comparaison de chaînes de caractères et certaines classes implémentent cette méthode pour se comparer plus précisément à d'autres classes.

                      Attention à ne pas être trop approximatif. Ca peut induire les débutant en erreur!.

                      Voilà un meilleure explication (en anglais) http://www.programmerinterview.com/index.php/java-questions/java-whats-the-difference-between-equals-and/

                      -
                      Edité par max-om-93 24 novembre 2014 à 16:50:26

                      • Partager sur Facebook
                      • Partager sur Twitter
                        25 novembre 2014 à 19:10:22

                        max-om-93 a écrit:

                        Attention à ne pas être trop approximatif. Ca peut induire les débutant en erreur!.

                        Voilà un meilleure explication (en anglais) http://www.programmerinterview.com/index.php/java-questions/java-whats-the-difference-between-equals-and/

                        Oui c'est vrai, comme on apprend à comparer les objets avec "equals", j'ai pensé bien faire. Après la différence est là : "==" teste l'emplacement mémoire de l'objet (pointeurs en C), et "equals" teste "l'égalité" des objets. Par égalité, j’entends que l'objet doit être du même type, et que ses fields doivent avoir les mêmes valeurs. Après, tout dépend de la classe comparée, certaines classes écrasent cette méthode pour la rendre plus performante ou plus exacte.

                        Oups... Au lieu de citer, j'ai signalé ^^. J'espère ne pas avoir fait de bêtise :/

                        Romain H. a écrit:

                        Désolé de ne pas t'avoir répondu plus tôt :/

                        J'ai utilisé la méthode equals() et ça fonctionne nickel, j'ai apporté quelques modifications par ci par là mais malheureusement il fallait rendre le projet et je n'ai pas eu le temps de tout finir. 

                        Merci beaucoup pour ton aide, tu m'as appris plein de choses en java :)

                        Pas de problème, je vais aussi sur le forum pour ça, et, occasionnellement, me faire aider :p
                        N'oublies pas de mettre ton sujet en résolu !

                        -
                        Edité par EclipseOnFire 25 novembre 2014 à 19:10:47

                        • Partager sur Facebook
                        • Partager sur Twitter
                        Error 2006, MySQL server has gone away

                        Problème placement interface+optimisation code

                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                        • Editeur
                        • Markdown