Partage
  • Partager sur Facebook
  • Partager sur Twitter

[java]grille étrange

j'espère ne plus avoir à vous déranger après...

Sujet résolu
    11 mai 2006 à 18:27:03

    [Résolu]


    Bonjour... Croyez bien que je regrette de demander de l'aide mais là je ne comprends pas mon erreur... en fait j'utilise le GridBagLayout et j'essaye d'avoir une grille avec 7 cases de différentes couleurs dnas l'image qui suit il y a à gauche ce que je devrais obteir en théorie et à droite ce que j'obtiens...
    http://img98.imageshack.us/img98/7843/java1rp.png
    Si quelqu'un peut m'aider.
    Merci


    import java.awt.BorderLayout;
    import java.awt.Component;
    import java.awt.Container;
    import java.awt.GridBagLayout;
    import java.awt.GridBagConstraints;
    import java.awt.Canvas;
    import java.awt.Dimension;
    import java.awt.Insets;
    import java.awt.event.AdjustmentEvent;
    import java.awt.event.AdjustmentListener;
    import java.awt.event.WindowEvent;
    import java.awt.event.WindowListener;
    import java.awt.font.*;
    import java.awt.Color;
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    import java.awt.*;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JTextArea;
    import javax.swing.JScrollBar;
    import javax.swing.JScrollPane;


    public class PlacementBordure extends JFrame implements WindowListener,AdjustmentListener {
        Font f_1  = new Font("Serif", Font.PLAIN,10);
        Font f_2  = new Font("Serif", Font.BOLD,10);

       
        Canvas dessin=new Canvas();
        JScrollBar slider1=new JScrollBar();
        JScrollBar slider2=new JScrollBar(0);
        JScrollBar slider3=new JScrollBar();
        JScrollBar slider4=new JScrollBar(0);
        JScrollPane panell;
        JPanel pane = new JPanel();
        JPanel paneHaut = new JPanel();
        JPanel paneBas = new JPanel();
        JPanel paneCentre = new JPanel();
        JPanel paneCentre2 = new JPanel();
        JPanel paneCentre3 = new JPanel();
        JPanel paneAjout = new JPanel();
       
        JPanel[] paneTab;
       
       
        GridBagLayout gbl = new GridBagLayout();
        GridBagConstraints gbc = new GridBagConstraints();
       
        int tailleCase, cpt, nbTot;
        JPanel[] tabCentres;
        ClasseTest cT = new ClasseTest();
       
        public PlacementBordure() {
            super("Projet M1");
    //        paneTab = new JPanel[nb];
            tailleCase = 50;
            nbTot = 9;
            tabCentres = new JPanel[nbTot];
            this.creerInterface();

            super.pack();
            super.setSize(500,500);
            super.setVisible(true);
        }
        public void creerInterface() {
            slider1.addAdjustmentListener(this);
            slider3.addAdjustmentListener(this);
            slider2.addAdjustmentListener(this);
            slider4.addAdjustmentListener(this);     

           
            JPanel pan = (JPanel)this.getContentPane();

            JTextArea texte = new JTextArea("texte      ");
            JTextArea texte1 = new JTextArea("texte1       ");
            JTextArea texte2 = new JTextArea("texte2         ");
            texte.setPreferredSize(new Dimension(120, 120));
            pane.setLayout(new BorderLayout());       
           
            paneAjout.setLayout(gbl);



            for(cpt = 0; cpt<nbTot;cpt++){
                tabCentres[cpt] = new JPanel();
                gbc = paneAff(tabCentres[cpt],cT.tabVal[cpt]);
                paneAjout.add(tabCentres[cpt], gbc);
                // c'est peut être le nom de la variable paneCentre
            }
           
            pane.add("Center",paneAjout);     
            pane.add("South",slider2);
            pane.add("East",slider1);
            paneHaut.setLayout(new BorderLayout());
            paneHaut.add("Center",texte1);
            paneHaut.add("South",slider4);
            paneBas.setLayout(new BorderLayout());
            paneBas.add("Center",texte2);
            paneBas.add("East",slider3);
           
            BorderLayout gestionnaire = new BorderLayout();
            pan.setLayout(gestionnaire);
            pan.add(pane, BorderLayout.CENTER);
            pan.add(paneHaut, BorderLayout.NORTH);
            pan.add(paneBas, BorderLayout.WEST);
        }
       
        public GridBagConstraints paneAff(Component sousComposant, Valeur val){

             int gX,gY,gH,gW;
            gX = val.x;
            gY = val.y;
            gH = val.taille[0]*tailleCase;
            gW = val.taille[1]*tailleCase;
            sousComposant.setPreferredSize(new Dimension((int)gH,(int)gW));
            //sousComposant.setPreferredSize(new Dimension((int)xX,(int)yY));
           
             choixStyle(val.style);
           
             GridBagConstraints contraintes= new GridBagConstraints();
             contraintes.fill= GridBagConstraints.NONE;
             contraintes.gridx = gX;
             contraintes.gridy = gY;
             contraintes.gridwidth = gW;
             contraintes.gridheight = gH;
          //  contraintes.anchor = GridBagConstraints.NORTHWEST;
             contraintes.ipadx = 0;
             contraintes.ipady = 0;
             return contraintes;
           
         }

        public void choixStyle(int choix){
            //choix font et background
           
            switch(choix){
            case 0 : tabCentres[cpt].setBackground(Color.BLUE);
            tabCentres[cpt].setFont(f_2);
                break;
            case 1 : tabCentres[cpt].setBackground(Color.GREEN);
            tabCentres[cpt].setFont(f_1);
                break;
            case 2 : tabCentres[cpt].setBackground(Color.RED);
            tabCentres[cpt].setFont(f_1);
                break;
            case 3 : tabCentres[cpt].setBackground(Color.YELLOW);
            tabCentres[cpt].setFont(f_1);
                          break;
            case 4 : tabCentres[cpt].setBackground(Color.CYAN);
            tabCentres[cpt].setFont(f_1);
              break;
            case 5 : tabCentres[cpt].setBackground(Color.GRAY);
            tabCentres[cpt].setFont(f_1);
                break;
                         
            default : tabCentres[cpt].setBackground(Color.WHITE);
            tabCentres[cpt].setFont(f_1);
                break;
       
            }
        }
       
        public void adjustmentValueChanged(AdjustmentEvent e){
            JScrollBar sb = (JScrollBar) e.getSource();
            if(sb == slider2){
                slider4.setValue(slider2.getValue());
            }
            if(sb == slider4){
                slider2.setValue(slider4.getValue());
            }       
            if(sb == slider1){
                slider3.setValue(slider1.getValue());
            }
            if(sb == slider3){
                slider1.setValue(slider3.getValue());
            }   
        }
       
        public static void main(String[] args) {
            PlacementBordure boite = new PlacementBordure();
        }
        public void windowActivated(WindowEvent e)  {}
        public void windowDeactivated(WindowEvent e)  {}
        public void windowOpened(WindowEvent e)  {}
        public void windowIconified(WindowEvent e)  {}
        public void windowDeiconified(WindowEvent e) {}
        public void windowClosed(WindowEvent e) {}

        public void windowClosing(WindowEvent e){
            System.exit(0)
        }
    }


    La classe test :

    public class ClasseTest {
        Valeur[] tabVal = new Valeur[15];
        int i;
        public ClasseTest(){
            for (int i=0;i<tabVal.length;i++){
              tabVal[i]=new Valeur();
            }
            tabVal[0].coordonnees = "01|01";
            tabVal[0].donnee = "donnée0";
            tabVal[0].style = 0;//bleu
            tabVal[0].taille[0] = 2;
            tabVal[0].taille[1] = 1;
            tabVal[0].x = 1;
            tabVal[0].y = 1;
            ///////////////////////////////
            tabVal[1].coordonnees = "03|02";
            tabVal[1].donnee = "donnée1";
            tabVal[1].style = 1;//vert
            tabVal[1].taille[0] = 1;
            tabVal[1].taille[1] = 1;
            tabVal[1].x = 3;
            tabVal[1].y = 2;
            ///////////////////////////////
            tabVal[2].coordonnees = "04|03";
            tabVal[2].donnee = "donnée2";
            tabVal[2].style = 2;//rouge
            tabVal[2].taille[0] = 1;
            tabVal[2].taille[1] = 2;
            tabVal[2].x = 4;
            tabVal[2].y = 3;
            ///////////////////////////////
            tabVal[3].coordonnees = "03|01";
            tabVal[3].donnee = "donnée3";
            tabVal[3].style = 3;//jaune
            tabVal[3].taille[0] = 1;
            tabVal[3].taille[1] = 1;
            tabVal[3].x = 3;
            tabVal[3].y = 1;
            ///////////////////////////////
            tabVal[4].coordonnees = "04|01";
            tabVal[4].donnee = "donnée4";
            tabVal[4].style = 4;//cyan
            tabVal[4].taille[0] = 1;
            tabVal[4].taille[1] = 1;
            tabVal[4].x = 4;
            tabVal[4].y = 1;
            ///////////////////////////////
            tabVal[5].coordonnees = "01|02";
            tabVal[5].donnee = "donnée5";
            tabVal[5].style = 5;//gris
            tabVal[5].taille[0] = 1;
            tabVal[5].taille[1] = 1;
            tabVal[5].x = 1;
            tabVal[5].y = 2;
            ///////////////////////////////
            tabVal[6].coordonnees = "01|03";
            tabVal[6].donnee = "donnée6";
            tabVal[6].style = 6;//blanc
            tabVal[6].taille[0] = 2;
            tabVal[6].taille[1] = 2;
            tabVal[6].x = 1;
            tabVal[6].y = 3;
        }
    }
    • Partager sur Facebook
    • Partager sur Twitter
      12 mai 2006 à 8:17:22

      Moi j'ai déjà utilisé des Box et des BoxLayout et c'était beaucoup plus simple (d'apres mon prof) que le GridBagLayout.

      Ensuite (toujours d'apres ce que m'a dit mon prof) ton code est horrible...

      extends JFrame <- pas bien !
      Car si tu veux hériter d'une autre classe, tu peux pas.
      Ensuite tapez toutes tes composants en global, mauvaise idée aussi. Faut le moins de variables globales !
      Si tu as besoin d'une variable, tu l'a passes en paramètres à la méthode qui en a besoin.

      Pour le BoxLayout, voici un exemple :
      (c'est pour un project que je dois rendre) :

              public Window() {
                      JFrame frame = new JFrame();

                      LayoutManager layout = new FlowLayout();
                      JPanel panel = new JPanel(layout);
                      JTextField text1 = new JTextField(20);
                      JTextField text2 = new JTextField(20);

                      JPanel panel = new JPanel(null);
                      panel.setLayout(new BoxLayout(panel,BoxLayout.Y_AXIS));
                      JTextField text1 = new JTextField(20); //path du fichier xml de load
                      JTextField text2 = new JTextField(20); //la fonction
                      JTextField text3 = new JTextField(20); //la fonction derivee
                      JTextField text4 = new JTextField(20); //path du fichier xml de sauv
                      JButton ouvrir = new JButton("Chercher");
                      JButton lecture = new JButton("Lecture");
                      JButton derive = new JButton("Deriver");
                      JButton sauver = new JButton("Sauver");
                      JButton quit = new JButton("Quit");
                      derive.setEnabled(false);
                      sauver.setEnabled(false);
                      Box top = new Box(BoxLayout.X_AXIS);
                      top.add(Box.createHorizontalGlue());
                      top.add(ouvrir);
                      top.add(Box.createHorizontalGlue());

                      Box ligne1 = new Box(BoxLayout.X_AXIS);
                      ligne1.add(Box.createHorizontalGlue());
                      ligne1.add(text1);
                      ligne1.add(Box.createHorizontalGlue());
                      ligne1.add(lecture);
                      ligne1.add(Box.createHorizontalGlue());

                      Box ligne2 = new Box(BoxLayout.X_AXIS);
                      ligne2.add(Box.createHorizontalGlue());
                      ligne2.add(text2);
                      ligne2.add(Box.createHorizontalGlue());
                      ligne2.add(derive);
                      ligne2.add(Box.createHorizontalGlue());
                      Box ligne3 = new Box(BoxLayout.X_AXIS);
                      ligne3.add(Box.createHorizontalGlue());
                      ligne3.add(text3);
                      ligne3.add(Box.createHorizontalGlue());

                      Box ligne4 = new Box(BoxLayout.X_AXIS);
                      ligne4.add(Box.createHorizontalGlue());
                      ligne4.add(text4);
                      ligne4.add(Box.createHorizontalGlue());
                      ligne4.add(sauver);
                      ligne4.add(Box.createHorizontalGlue());

                      Box ligne5 = new Box(BoxLayout.X_AXIS);
                      ligne5.add(Box.createHorizontalGlue());
                      ligne5.add(quit);
                      ligne5.add(Box.createHorizontalGlue());

                      panel.add(top);
                      panel.add(ligne1);
                      panel.add(ligne2);
                      panel.add(ligne3);
                      panel.add(ligne4);
                      panel.add(ligne5);

                      frame.setTitle("Test");
                      frame.setContentPane(panel);
                      frame.setSize(400,300);
                      frame.setLocation(500,500);
                      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                      frame.pack();
                      frame.setVisible(true);
              }

      (J'ai viré les cliques sur les boutons car c'est inutile ici)
      • Partager sur Facebook
      • Partager sur Twitter
        12 mai 2006 à 11:40:37

        Je sais parfaitement que on code est horrible, c'est un brouillon, la version finale sera bien différente.

        En ce qui concerne les variables globales, tant que je ne connais pas tous les endroits où elles seront utilisées je les laisse en global. Ensuite je verrai où les remettre. Mais je n'aime pas me soucier de la lisibilité du code tant que je 'narrive pas à la version finale.

        Enfin j'ai besoin du GridBagLayout vu ce qu'on me demande d'afficher. Vu ce que j'ai pu lire sur ls autres gestionnaires, ça n'offre pas la liberté dont j'ai besoin. Hélas....

        Ceci dit j'ai résoulu le pb depuis que j'ai posté ce message (car même si j'en ai pas l'air parfois je réfléchis :P)
        • Partager sur Facebook
        • Partager sur Twitter
          12 mai 2006 à 13:26:52

          Citation : kokotchY


          extends JFrame <- pas bien !
          Car si tu veux hériter d'une autre classe, tu peux pas.
          Ensuite tapez toutes tes composants en global, mauvaise idée aussi. Faut le moins de variables globales !
          Si tu as besoin d'une variable, tu l'a passes en paramètres à la méthode qui en a besoin.



          Alors la je suis pas d'accord faire un extends des classe swing n'a rien de crade, et mettre les composants en variable de classe n'a rien de faux.

          Meme si l'heritage multiple n'est pas possible en JAVA, c'est beaucoup plus propre de dériver des classe swing afin de pouvoir surcharger la methode paintComponent() et autre fioritures de ce genre. De plus on peut se passez de l'heritage multiple pour les les classe type UI car en général elle extends que l'un des composant SWING (sinon on peut se debrouiller avec les interfaces)

          Avoir les variables des JComposants n'a rien de lourd et est même beaucoup plus propre car au moins tu sais de quoi est composé ta fenetre.

          je m'explique

          public class MaClass extends ClasseMere
          {
              private int val1;
              private int val2;
          }


          Tu lis ca de cette facon suivante : MaClass est une extension de la ClasseMere qui possède deux attributs val1 et val2.

          La sa classe est MaFrame qui est une extension de JFrame qui possède plusieurs attributs qui sont les JPanel, Jtextarea.. formant cette Frame.
          • Partager sur Facebook
          • Partager sur Twitter
            12 mai 2006 à 13:54:58

            +1

            étendre les classe swing est très propre je trouve par contre implémenter les listener directement dans la classe frame l'est beaucoup moins, les class interne sont beaucoup plus propre.

            enfin bon ici c'est surtout une question de philosophie. De toute facon les prof ne sont jamais d'accord entre eux. Et les informatitiens non plus. D'ailleurs il existe un nom pour ce genre de discussion

            => troll velu et poilu puant la bière
            • Partager sur Facebook
            • Partager sur Twitter
              12 mai 2006 à 14:38:36

              Non c'est pas un troll juste "comment programmer correctement" je m'appuye sur les tutos de sun pour dire ca

              PS : defendre un point de vue n'est pas un troll
              • Partager sur Facebook
              • Partager sur Twitter
                12 mai 2006 à 16:36:27

                Je sais plus pourquoi c'est mal, mais le prof avait donné des bonnes raisons :-°
                mais je m'en souviens plus :x
                • Partager sur Facebook
                • Partager sur Twitter
                  12 mai 2006 à 16:46:53

                  je parlais des dispute en générale entre programmeur qui souvent ne s'appuye pas sur des arguments valable parce que les deux cas sont tout aussi bien mais ca dépend des préférence de chacun. :p

                  sinon

                  Citation : Pas de titre

                  Avoir les variables des JComposants n'a rien de lourd et est même beaucoup plus propre car au moins tu sais de quoi est composé ta fenetre.



                  je suis tout a fait d'accord que de mettre les objet JCompenents en variable d'instance est beaucoup plus propre mais rien n'empeche de le faire même si on étend pas la classe frame. donc cet argument est moyen. ;)

                  Par contre un très bon argument est:

                  Citation : Pas de titre

                  afin de pouvoir surcharger la methode paintComponent()




                  ps: donner son avis sans arguments (comme je le fait), c'est ce rapprocher du troll :p

                  oh et puis merde on s'en fou de toute facon le code était dégeu :lol:

                  surtout cette partie

                  public void windowActivated(WindowEvent e)  {}
                      public void windowDeactivated(WindowEvent e)  {}
                      public void windowOpened(WindowEvent e)  {}
                      public void windowIconified(WindowEvent e)  {}
                      public void windowDeiconified(WindowEvent e) {}
                      public void windowClosed(WindowEvent e) {}

                      public void windowClosing(WindowEvent e){
                          System.exit(0);
                      }



                  qui aurait pu être remplacé par un petit setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); dans le constructeur.

                  bon sur ce je vais arreter de faire le boulet et terminer se post

                  et je sort :-°
                  • Partager sur Facebook
                  • Partager sur Twitter
                    12 mai 2006 à 17:29:22

                    L'avantage du WindowsListener c'est que tu controle ton appli lors de la fermeture de la fenêtre ce que le setDefaultCloseOperation ne te permet pas (par exemple en fermant une fenetre de rendu tu peux terminer un Timer de calcul par exemple)

                    Pour eviter d'avoir toutes ces fonction sur les fenetre on peut extends WindowsAdapter qui lui contient deja l'ensemble des fonctions qui choppent les WindowsEvent et qui implements le WindowsListener et ainsi redefinir qu'une seule des methodes qui nous interesse :

                    http://www.infres.enst.fr/~charon/coursJava/interSwing/adaptateurs.html

                    PS : Pour les JComposants je disais que c'etait plus propre de les mettre en attribut mais en aucun cas j'ai mentionné "parce que il extends la classe JFrame", j'ai juste dit que la combinaison des deux était beaucoup plus propre
                    • Partager sur Facebook
                    • Partager sur Twitter
                      12 mai 2006 à 18:15:53

                      si je répond ca ne va servir à rien et puis se post est résolu alors moi je clos le débat ici

                      ps: n'empeche que dans le cas présent ma méthode est tout aussi bien, puisqu'il ne fait que de quitter le programme et en plus balbla, si tu n'utilise pas cette méthode et qu'on laisse le comportement par défaut on peut avoir de sale blague avec les JFrame

                      • Partager sur Facebook
                      • Partager sur Twitter

                      [java]grille étrange

                      × 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