Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Java] une exception

    16 mai 2006 à 16:16:38

    Bonjour, toujours dans le cadre de mon projet, je sollicite votre aide. Cette fois ma classe est intégrée à une application qui la lance..
    Et en fait il me sort une erreur que je ne comprends pas... En mode Debug j'ai vu que le programme finissait la méthode Creerinterface avant de s'arrêter au super.pack()... (quand je retire cette instruction, il s'arrête deux lignes plus bas..)

    si quelqu'un peut m'aider... peut être une indication :euh:
    Merci

    package database.multidim.affichage.ecran;

    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.*;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JTextArea;
    import javax.swing.JScrollBar;
    import javax.swing.JScrollPane;

    import database.multidim.affichage.Cellule;
    import database.multidim.affichage.Valeur;


    import java.util.ArrayList;

    /**
     * Permet l'affichage des données envoyées
     * @author Renan
     *
     */

    public class Ecran extends JFrame implements WindowListener,AdjustmentListener {
            Font f_1  = new Font("Serif", Font.PLAIN,10);//servent pour les styles de cases
            Font f_2  = new Font("Serif", Font.BOLD,10);

            JScrollBar slider3=new JScrollBar();//vont être supprimées
            JScrollBar slider4=new JScrollBar(0);//
           
            JScrollPane panell;          // le panneau central, sur lequel sera mis le JPanel qui contient les cases
            JScrollPane paneAxeHaut;// le panneau du haut, sur lequel sera mis le JPanel qui contient les axes
            JScrollPane paneAxeGauche; // le panneau du bas, surlequel sera mis le JPanel qui contient les axes

            JPanel paneHaut = new JPanel();//l'axe du haut
            JPanel paneGauche = new JPanel();//l'axe sur la gauche

            JPanel paneAjout = new JPanel();//le JPanel sur lequel on dessine les cases.
                   
            //les gestionnaires et leurs contraintes
            GridBagLayout gbl = new GridBagLayout();
            GridBagConstraints gbc = new GridBagConstraints();
            GridBagLayout gblHaut = new GridBagLayout();
            GridBagConstraints gbcHaut = new GridBagConstraints();
            GridBagLayout gblGauche = new GridBagLayout();
            GridBagConstraints gbcGauche = new GridBagConstraints();
           
            int tailleCase, cpt, nbTot, axeTotH, axeTotG;
            //tailleCase est la variable qui sert à calculer la taille des cases et leur position
            //cpt est un compteur
            //nbTot est un majorant du nombre de faits.
            //axeTotH est celui du nombre de cellules en haut
            //axeTotG, celui pour l'axe à gauche
           
            Case[] tabCentres;// c'est l'ensemble des cases à afficher
            Case[] tabHauts;// c'est l'ensemble des axes du haut à afficher
            Case[] tabGauches;// C'est l'ensemble des axes de gauche à afficher

           
            int axeHautX,axeHautY;
            //les coordonées des cases sur l'axe du haut
            int axeGaucheX,axeGaucheY;
            //les coordonées des cases sur l'axe de gauche
           
           
            ArrayList[] axis = new ArrayList[2];
            //les axes
            ArrayList temp = new ArrayList();
           
            Valeurs[] cT;
            Valeurs vall = new Valeurs();
            Cellule cell = new Cellule();
            /**
             * Constructeur de base. Il s'agit d'initialiser les variables et la fenêtre.
             *
             */

            public Ecran(ArrayList[] a,Valeur[][] vale) {
                    super("Projet M1");
                    int i,j;
                    cpt = 0;
            for(i=0;i<vale.length;i++){
                    for(j=0;j<vale[i].length;j++){
                            if(vale[i][j]!=null){
                                    cpt++; 
                            }
                    }
            }
            cT = new Valeurs[cpt];
            tabHauts = new Case[cpt];
            tabGauches = new Case[cpt];
            for(i=0;i<cpt;i++) {
                    cT[i] = new Valeurs();
            }
            cpt = -1;
            for(i=0;i<vale.length;i++){
                    for(j=0;j<vale[i].length;j++){
                            if(vale[i][j]!=null){
                                    cpt++;
                                    cT[cpt].coordonnees = vale[i][j].coordonnees;
                                    cT[cpt].donnee = vale[i][j].donnee;
                                    cT[cpt].style = vale[i][j].style;
                                    cT[cpt].taille = vale[i][j].taille;
                                    cT[cpt].x = i;
                                    cT[cpt].y = j;
                            }
                    }
            }
            tailleCase = 50;
            nbTot = cpt;
            axeTotH = cpt;
            axeTotG = cpt;
            tabCentres = new Case[nbTot];
            axeHautX=1;
            axeHautY=1;
            axeGaucheX=1;
            axeGaucheY=1;
            axis = a;
            this.creerInterface();

            super.pack();
            super.setSize(1024,734);
            super.setVisible(true);
           
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
           
            /**
             * Le véritable moteur d'affichage. Il s'agit d'installer chacun des éléments graphiques.
             *
             */

        public void creerInterface() {
            int a,b;//compteurs pour mettre les axes.
           
            //installation des gestionnaires.     
            paneAjout.setLayout(gbl);
            paneHaut.setLayout(gblHaut);
            paneGauche.setLayout(gblGauche);
           
            //Pour chacun des faits on :
            for(cpt = 0; cpt<nbTot;cpt++){
                    tabCentres[cpt] = new Case(cT[cpt].donnee,cT[cpt].coordonnees,cT[cpt].style);
                    //crée une Case
                    gbc = paneAff(tabCentres[cpt],cT[cpt]);
                    //on crée les contraintes
                    tabCentres[cpt] = choixStyle(cT[cpt].style, tabCentres[cpt]);
                    //le choix du style d'écriture et du fond de la case
                    paneAjout.add(tabCentres[cpt], gbc);
                    //On ajoute la Case sur le JPanel fait pour.
            }
           
            cpt = -1;
            for(a = 0; a<axis[0].size();a++){
                    temp=(ArrayList)axis[0].get(a);
                    axeHautX = 1;
                    axeHautY = a*tailleCase+1;
                    for(b=0;b<temp.size();b++){
                            cpt++;
                            tabHauts[cpt] = new Case(((Cellule)temp.get(b)).donnee," ",((Cellule)temp.get(b)).style);
                            //crée une Case
                            vall.coordonnees = " ";
                            cell = (Cellule)temp.get(b);
                            vall.donnee = cell.donnee;
                            vall.style = cell.style;
                            vall.taille[0] = (int)cell.taille[0];
                            vall.taille[1] = (int)cell.taille[1];
                            vall.x = axeHautX;
                            vall.y = axeHautY;
                            gbcHaut = paneAff(tabHauts[cpt],vall);
                            //on crée les contraintes

                    axeHautX = axeHautX + vall.taille[0]*tailleCase;
                            tabHauts[cpt] = choixStyle(((Cellule)temp.get(b)).style,tabHauts[cpt]);
                            //le choix du style d'écriture et du fond de la case
                            paneHaut.add(tabHauts[cpt], gbcHaut);
                            //On ajoute la Case sur le JPanel fait pour.
                    }
            }
            cpt = -1;
            for(a = 0; a<axis[1].size();a++){
                    temp=(ArrayList)axis[1].get(a);
                    axeGaucheX = 1;
                    axeGaucheY = a*tailleCase+1;
                    for(b=0;b<temp.size();b++){
                            cpt++;
                            tabGauches[cpt] = new Case(((Cellule)temp.get(b)).donnee," ",((Cellule)temp.get(b)).style);
                            //crée une Case
                            vall.coordonnees = " ";
                            cell = (Cellule)temp.get(b);
                            vall.donnee = cell.donnee;
                            vall.style = cell.style;
                            vall.taille[0] = (int)cell.taille[0];
                            vall.taille[1] = (int)cell.taille[1];
                            vall.x = axeHautX;
                            vall.y = axeHautY;
                            gbcGauche = paneAff(tabGauches[cpt],vall);
                            //on crée les contraintes

                    axeGaucheX = axeGaucheX + vall.taille[0]*tailleCase;           
                            gbcGauche = paneAff(tabGauches[cpt],vall);
                            //on crée les contraintes
                            tabGauches[cpt] = choixStyle(((Cellule)temp.get(b)).style,tabGauches[cpt]);
                            //le choix du style d'écriture et du fond de la case
                            paneGauche.add(tabGauches[cpt], gbcGauche);
                            //On ajoute la Case sur le JPanel fait pour.
                    }
            }
            panell = new JScrollPane(paneAjout);
            //On met le JPanel qui contient les cases dans un JScrollPane afin d'avoir
            //des JScrollBar quand c'est nécessaire
            paneAxeHaut = new JScrollPane(paneHaut);
            paneAxeGauche = new JScrollPane(paneGauche);
           
            paneAxeGauche.getHorizontalScrollBar().addAdjustmentListener(this);
            paneAxeHaut.getHorizontalScrollBar().addAdjustmentListener(this);
            panell.getHorizontalScrollBar().addAdjustmentListener(this);
            panell.getVerticalScrollBar().addAdjustmentListener(this);
            //Ici on indique que les scrollbar réagissent à certains évennements

           
            JPanel pan = (JPanel)this.getContentPane();       
            BorderLayout gestionnaire = new BorderLayout();
            pan.setLayout(gestionnaire);
            pan.add(panell, BorderLayout.CENTER);
            pan.add(paneAxeHaut, BorderLayout.NORTH);
            pan.add(paneAxeGauche, BorderLayout.WEST);
            //Ici on place toutes les différents panneaux dans la fenêtre.
        }
        /**
         * Permet d'installer les Valeur sur les Cases
         * @param sousComposant : correspond à la case pour lequel on veut connaître les contraintes.
         * @param val : la Valeur à appliquer à la contrainte.
         * @return : retourne un GridBagConstraints pour le gestionnaire GridBagLayout
         */

        public GridBagConstraints paneAff(Component sousComposant, Valeurs val){
            int gX,gY,gH,gW;//Les variables temporaires
            gX = val.x*tailleCase;
            gY = val.y*tailleCase;
            //Positionnement
            gH = val.taille[0]*tailleCase;
            gW = val.taille[1]*tailleCase;

            sousComposant.setPreferredSize(new Dimension((int)gH,(int)gW));
            //Taille
           
            GridBagConstraints contraintes= new GridBagConstraints();
            contraintes.fill= GridBagConstraints.NONE;
            contraintes.gridx = gX;
            contraintes.gridy = gY;
            contraintes.gridwidth = gW;
            contraintes.gridheight = gH;
            contraintes.anchor = GridBagConstraints.NORTHWEST;
            //Les différentes contraintes de la Case
           
            return contraintes;
            
         }

       
        /**
         * Permet de choisir le type de case (couleur et police)
         * @param choix : le style choisi
         * @return un Axes modifié
         */

        public Case choixStyle(int choix, Case tab){
            //choix font et background   
            switch(choix){
            case -1 : tab.setBackground(Color.WHITE);
                      tab.setFont(f_1);
                      break;
            case 0 : tab.setBackground(Color.WHITE);
                     tab.setFont(f_1);
                     break;
            case 1 : tab.setBackground(Color.WHITE);
                     tab.setFont(f_2);
                     break;
            case 2 : tab.setBackground(Color.CYAN);
                     tab.setFont(f_1);
                     break;
            case 3 : tab.setBackground(Color.CYAN);
                     tab.setFont(f_2);
                                   break;
            default : tab.setBackground(Color.BLACK);
                      tab.setFont(f_2);
                      break;
           
            }
            return tab;
        }
       
        /**
         * Décrit ce qui se passe quand la valeur des scrollbar change.
         * Ici il s'agit de lier les scrollbar des axes et des cases.
         */

            public void adjustmentValueChanged(AdjustmentEvent e){
                    JScrollBar sb = (JScrollBar) e.getSource();
                    if(sb == panell.getHorizontalScrollBar()){
                            paneAxeHaut.getHorizontalScrollBar().setValue(panell.getHorizontalScrollBar().getValue()*100/paneAxeHaut.getHorizontalScrollBar().getMaximum());
                    }
                    if(sb == paneAxeHaut.getHorizontalScrollBar()){
                            panell.getHorizontalScrollBar().setValue((paneAxeHaut.getHorizontalScrollBar().getValue()/**100*/)/*/panell.getHorizontalScrollBar().getMaximum()*/);
                    }              
                    if(sb == panell.getVerticalScrollBar()){
                            paneAxeGauche.getHorizontalScrollBar().setValue((panell.getVerticalScrollBar().getValue()*100)/paneAxeGauche.getHorizontalScrollBar().getMaximum());
                    }
                    if(sb == paneAxeGauche.getHorizontalScrollBar()){
                            panell.getVerticalScrollBar().setValue(paneAxeGauche.getHorizontalScrollBar().getValue());
                    }       
            }

       
        /**
         * Méthode par défaut due aux Implements
         */

            public void windowActivated(WindowEvent e)  {}
        /**
         * Méthode par défaut due aux Implements
         */

            public void windowDeactivated(WindowEvent e)  {}
        /**
         * Méthode par défaut due aux Implements
         */

            public void windowOpened(WindowEvent e)  {}
        /**
         * Méthode par défaut due aux Implements
         */

            public void windowIconified(WindowEvent e)  {}
        /**
         * Méthode par défaut due aux Implements
         */

            public void windowDeiconified(WindowEvent e) {}
        /**
         * Méthode par défaut due aux Implements
         */

            public void windowClosed(WindowEvent e) {}
        /**
         * Méthode par défaut due aux Implements
         */

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


    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10050
            at java.awt.GridBagLayout.GetLayoutInfo(Unknown Source)
            at java.awt.GridBagLayout.getLayoutInfo(Unknown Source)
            at java.awt.GridBagLayout.preferredLayoutSize(Unknown Source)
            at java.awt.Container.preferredSize(Unknown Source)
            at java.awt.Container.getPreferredSize(Unknown Source)
            at javax.swing.JComponent.getPreferredSize(Unknown Source)
            at javax.swing.ViewportLayout.preferredLayoutSize(Unknown Source)
            at java.awt.Container.preferredSize(Unknown Source)
            at java.awt.Container.getPreferredSize(Unknown Source)
            at javax.swing.JComponent.getPreferredSize(Unknown Source)
            at javax.swing.ScrollPaneLayout.preferredLayoutSize(Unknown Source)
            at java.awt.Container.preferredSize(Unknown Source)
            at java.awt.Container.getPreferredSize(Unknown Source)
            at javax.swing.JComponent.getPreferredSize(Unknown Source)
            at java.awt.BorderLayout.preferredLayoutSize(Unknown Source)
            at java.awt.Container.preferredSize(Unknown Source)
            at java.awt.Container.getPreferredSize(Unknown Source)
            at javax.swing.JComponent.getPreferredSize(Unknown Source)
            at javax.swing.JRootPane$RootLayout.preferredLayoutSize(Unknown Source)
            at java.awt.Container.preferredSize(Unknown Source)
            at java.awt.Container.getPreferredSize(Unknown Source)
            at javax.swing.JComponent.getPreferredSize(Unknown Source)
            at java.awt.BorderLayout.preferredLayoutSize(Unknown Source)
            at java.awt.Container.preferredSize(Unknown Source)
            at java.awt.Container.getPreferredSize(Unknown Source)
            at java.awt.Window.pack(Unknown Source)
            at database.multidim.affichage.ecran.Ecran.<init>(Ecran.java:130)
            at database.multidim.affichage.Affichage.affiche(Affichage.java:78)
            at database.multidim.affichage.Affichage.<init>(Affichage.java:59)
            at Main.main(Main.java:178)
    • Partager sur Facebook
    • Partager sur Twitter
      16 mai 2006 à 18:03:56

      L'erreur vient du fait que tu dépasses en indice la capacité d'un tableau (indice 10050 apparement, qui n'existe pas).

      Dans les deux cas (avec ou sans pack), l'erreur provient du fait que tu as redéfinis je ne sais où la taille préférée. L'interpréteur est très clair sur ce point : Quelque chose cloche au niveau du gestionnaire d'agencement, la taille préférée s'emmêle les pinceaux et comme tu n'as aucune try dans ton code (il n'y a pas de raison d'en mettre je pense ici) tout le programme s'arrête.

      Donc voila, je vois pas trop le rapport entre un dépassement de tableau et une erreur de taille, mais il y a un rapport. Vire tous les changements de tailles (forcés ou souhaités) pour voir si ca se reproduit. Je parle bien sûr des dimensions données par toi-même, la méthode pack fonctionne en principe sans problème et ne doit pas être supprimée.

      PS (dernière fois que j'en parle): encore un setSize. Je n'ose même pas imaginer ce qu'il se serait passé si le programme ne plantait pas et que ton client ouvre la fenêtre avec un écran 800*600 :(
      • Partager sur Facebook
      • Partager sur Twitter
        17 mai 2006 à 19:39:50

        C'est bon j'ai trouvé, un pb d'index bien trop important pour les gestionnaire.. M'enfin bon...

        En revanche, je veux bien mettre autre chose qu'un setsize, il suffit ue je sache quoi :p (même si en l'occrence a ne pose pas pb vu la destination de l'application, ça pourra me servir plus tard).

        • Partager sur Facebook
        • Partager sur Twitter
          17 mai 2006 à 19:47:41

          Comme je l'ai déja dit, il n'y a pas à mette de setSize : c'est à Java à se débrouiller entre les éléments à afficher et le matériel dont il dispose pour le faire.

          Tout ce que demande le programmeur, c'est que les éléments soient agencés de sorte que leurs positions réflètent une structure, une organisation de sorte que l'utilisateur ait un programme intuitif. C'est du domaine de la topologie en quelque sorte : peu importe les distances, du moment que les inclusions et les positionnements relatifs soient respectés.

          Donc le simple fait d'utiliser un embriquement des gestionnaires suffit à expliquer à Java comment on veut que ca se présente. Le reste est à la discrétion de la VM.

          Sinon je ne vois pas comment un problème d'indice peut être trop important pour un gestionnaire o_O
          • Partager sur Facebook
          • Partager sur Twitter
            17 mai 2006 à 20:45:05

            nah mais en fait ça donnait une taille (ou une position, chais plus) trop importante plus de 1000 là... Et il n'appréciait pas..
            • Partager sur Facebook
            • Partager sur Twitter

            [Java] une exception

            × 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