Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème d'onglet étonnant

    22 juin 2009 à 23:09:35

    Bonsoir a tous,
    je suis débutant en java et il se trouve que je dois coder une interface graphique dans le cadre d'un projet. Je crée une frame avec des onglets ( JTabbedPane) et mon problème est le suivant, lorsque j'ajoute un objet a mon onglet ( en l'occurrence un objet de type graphics avec une méthode que j'ai crée ) il me l'affiche sur tous mes onglets.
    Sa fait un bout de temps que je galère sur se problème et je sais vraiment plus quoi faire.
    je vous remercie d'avance pour vos réponses
    • Partager sur Facebook
    • Partager sur Twitter
      23 juin 2009 à 9:23:11

      post ton code pour voir c'est visualiser c'est plus facile mais je dirais problème à la construction. Sinon mate ce tuto :tuto
      • Partager sur Facebook
      • Partager sur Twitter
        23 juin 2009 à 10:20:17

        Dans ma classe interface graphique je l'appelle de la façon suivante
        cf.Draw(0, batiment.getGraphics());
        

        cf étant mon objet et bâtiment mon panel

        Ceci est ma méthode dans la classe de mon objet crée

        public void Draw(int id, Graphics g){
                for (Iterator<EnsembleDePiece> it = immeuble.iterator(); it.hasNext();) {
                    EnsembleDePiece ensemble = it.next();
                    if (ensemble.getId()== id){
                        ensemble.draw(g);
                    }
                }
            }
        


        méthode draw appelée l5 :
        @Override public void draw(Graphics g) {
        		if (getNbpers() > (2*getCapmax()/3)){
        			g.setColor(Color.RED);
        		} else if (getNbpers() == 0) {
                    g.setColor(Color.WHITE);
                } else if (getNbpers() < (getCapmax()/3)){
        			g.setColor(Color.GREEN);
        		} else {
        			g.setColor(Color.ORANGE);
        		}
                g.fillRect(getPref().x, getPref().y, getLongueur(), getLargeur());
                g.setColor(Color.BLACK);
                g.drawRect(getPref().x, getPref().y, getLongueur(), getLargeur());
            }
        


        Je pense que mon problème est du au fait que je n'ajoute pas mon objet correctement dans mon panel, mais je ne sais pas du tout comment procéder

        merci d'avance
        • Partager sur Facebook
        • Partager sur Twitter
          23 juin 2009 à 10:34:14

          Soit je suis aveugle, soit je vois pas l'endroit dans ton code où tu crées ton jtabbedPane et ou t'ajoute ton graphics. Or, c'est dans cette partie où tu as un problème pas dans le dessin d'après ton premier message n'est ce pas ?
          • Partager sur Facebook
          • Partager sur Twitter
            23 juin 2009 à 10:41:53

            Je suppose que c'est au niveau de l'affichage que j'ai le problème je n'en suis pas sur
            voici le code complet de mon interface, je te préviens je débute en java donc mon code doit être assez vilain.

            package InterfaceGraphique;
            
            import java.awt.Dimension;
            import java.awt.Font;
            import java.awt.Graphics;
            import java.awt.event.*;
            import javax.swing.*;
            import java.util.ArrayList;
            import java.io.*;
            
            public class InterfaceGraphique extends JFrame implements MouseListener {
            
                private CoreFonctionnel.CoreFonctionnel cf;
                private JFrame fenetre;
                private JPanel batiment;
                private JTabbedPane onglets;
                private JButton lancer;
                private JButton avancer;
                private JButton fin;
                private JMenu fichier;
                private JMenuBar menu_bar;
                private JMenuItem ouvrir;
                private JMenuItem quitter;
                private File current;
                private JLabel chrono;
                private int minutes = 0;
                private int secondes = 5;
                private ArrayList<JPanel> l = new ArrayList<JPanel>();
            
                public InterfaceGraphique(CoreFonctionnel.CoreFonctionnel cf) {
            
                    fenetre = new JFrame();
                    onglets = new JTabbedPane();
                    batiment = new JPanel();
            		lancer = new JButton();
            		avancer = new JButton();
                    fin = new JButton();
                    menu_bar = new JMenuBar();
                    fichier = new JMenu();
                    ouvrir = new JMenuItem();
                    quitter = new JMenuItem();
                    chrono = new JLabel();
                    
                    this.cf = cf;
            
                    batiment.setLayout(null);
                    fenetre.add(onglets);
                    chrono.setFont(new Font("Calibri", 0, 24));
                    chrono.setText("00:00");
                    fenetre.add(chrono);
                    chrono.setBounds(20, 510, 60, 30);
            
                    lancer.setText("Lancer simulation");
                    lancer.setMaximumSize(new Dimension(100, 30));
                    lancer.setMinimumSize(new Dimension(100, 30));
                    lancer.setPreferredSize(new Dimension(100, 30));
                    fenetre.add(lancer);
                    lancer.setBounds(100, 510, 150, 30);
            
                    lancer.addActionListener(new ActionListener() {
                        public void actionPerformed( ActionEvent evt) {
                            lancerActionPerformed(evt);
                        }
                    });
            
                    avancer.setText("Avancer");
                    avancer.setMaximumSize(new Dimension(100, 30));
                    avancer.setMinimumSize(new Dimension (100, 30));
                    avancer.setPreferredSize(new Dimension (100, 30));
            		fenetre.add(avancer);
                    avancer.setBounds(270, 510, 100, 30);
            
                    avancer.addActionListener(new ActionListener() {
                        public void actionPerformed( ActionEvent evt) {
                            avancerActionPerformed(evt);
                        }
                    });
                    fin.setText("Fin simulation");
                    fin.setMaximumSize(new Dimension (100, 30));
                    fin.setMinimumSize(new Dimension (100, 30));
                    fin.setPreferredSize(new Dimension (100, 30));
                    fenetre.add(fin);
                    fin.setBounds(390, 510, 150, 30);
            
                    fin.addActionListener(new ActionListener() {
                        public void actionPerformed( ActionEvent evt) {
                            finActionPerformed(evt);
                        }
                    });
            
                    fichier.setText("Fichier");
            
                    ouvrir.setText("Ouvrir");
                    ouvrir.addActionListener(new ActionListener() {
                        public void actionPerformed(ActionEvent evt) {
                            jMenuItem2ActionPerformed(evt);
                        }
                    });
                    fichier.add(ouvrir);
            
                    quitter.setText("Quitter");
                    quitter.addActionListener(new ActionListener() {
                        public void actionPerformed(ActionEvent evt) {
                            jMenuItem3ActionPerformed(evt);
                        }
                    });
                    fichier.add(quitter);
            
                    menu_bar.add(fichier);
                    fenetre.setJMenuBar(menu_bar);
                    onglets.addTab("Batiment", batiment);
                    fenetre.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                    fenetre.setSize(600,600);
                    create_etage(5);
                    //batiment.addMouseListener(this);
                    fenetre.getContentPane().add(onglets);
                    fenetre.setVisible(true);
                }
                public void dessin (CoreFonctionnel.CoreFonctionnel cf, JPanel pan1){
                    cf.Draw(0, pan1.getGraphics());
                    pan1.setLayout(null);
                    pan1.add(cf);
                    pan1.setVisible(true);
                }
            
                private void avancerActionPerformed(ActionEvent evt) {
                    this.dessin(cf,batiment);
            
                    if (secondes <=9 && minutes <=9) {
                        chrono.setText("0"+minutes+":0"+secondes);
                    } else if (minutes <=9){
                        chrono.setText("0"+minutes+":"+secondes);
                    } else if (secondes <=9  ) {
                        chrono.setText(minutes+":0"+secondes);
                    } else {
                          chrono.setText(minutes+":"+secondes);
                    }
            
                    secondes+=5;
            
                    if(secondes==60){
                        minutes+=1;
                        secondes=0;
                    }
                    cf.Step();
            
                }
                private void finActionPerformed(ActionEvent evt) {
            
                    while (cf.get_nb_imm()> 0){
            
                    if (secondes <=9 && minutes <=9) {
                        chrono.setText("0"+minutes+":0"+secondes);
                    } else if (minutes <=9){
                        chrono.setText("0"+minutes+":"+secondes);
                    } else if (secondes <=9  ) {
                        chrono.setText(minutes+":0"+secondes);
                    } else {
                          chrono.setText(minutes+":"+secondes);
                    }
                    cf.Step();
                    secondes+=5;
                    if(secondes==60){
                        minutes+=1;
                        secondes=0;
                    }
                    
                    } 
                    
            
                }
            
                private void jMenuItem2ActionPerformed(ActionEvent evt) {
                    clicOuvreFichier();
                }
                void clicOuvreFichier() {
            
                    JFileChooser lDialogueFichier = new JFileChooser();
                    lDialogueFichier.setCurrentDirectory(current);
                    int lValeurRetour = lDialogueFichier.showOpenDialog(fenetre);
                    String lNomFichier = lDialogueFichier.getSelectedFile().getPath();
                    current =lDialogueFichier.getCurrentDirectory();
                }
                private void jMenuItem3ActionPerformed(ActionEvent evt) {
                    System.exit(0);
                }
            	private void create_etage (int nb_etage){
            		for (int i=0; i< nb_etage; i++){
                        JPanel onglet = new JPanel ();
                        onglet.setLayout(null);
                        l.add(onglet);
                        if (i==0) {
                            onglets.addTab("RDC", l.get(i));
                        } else {
                            onglets.addTab("Etage "+i, l.get(i));
                        }
            		}
            	}
                private void lancerActionPerformed(ActionEvent evt) {
            
                }
            
            • Partager sur Facebook
            • Partager sur Twitter
              23 juin 2009 à 11:13:19

              Effectivement c'est le bor*** :-°

              Bon alors plusieurs remarques :
              1) tu peux mettre des Strings quand tu crées tes boutons pour afficher un texte dessus new Jbutton(String s) ;

              2) Si ta classe hérite de Jframe pas besoin de redéfinir une nouvelle fenêtre (après c'est ton choix)

              3)tu te sert pas du MouseListener que tu as implémenté

              4) ta méthode clicOuvreFichier n'est pas explicitement définie public

              5) c'est quoi que t'obtient d'affiché ?

              6) l'algorithme de ta méthode de création détage est totalement faux et à revoir

              7) que fait ta classe Corefonctionnel ?

              8) dans ton dessin tu ajoute ton pan1 à rien donc il n'est pas sensé apparaître à l'écran(sauf erreur de ma part)

              9) deplus ton corefonctionnel dessine le pan1 mais il est également contenu dedans ?

              honnêtement je te conseille de lire des tutos et de commencer par plus simple. La tu vas pas t'en sortir

              • Partager sur Facebook
              • Partager sur Twitter
                23 juin 2009 à 11:47:42

                Pourquoi faire setPreferredSize et setBounds juste après ? Ce sont deux méthodes antinomiques.
                setPreferredSize sert aux Layouts donc à du positionnement relatif, setBounds sert au positionnement absolu...

                Et les jMenuItem3ActionPerformed, ça aide pas beaucoup à savoir de quoi tu parles !
                Mets des noms explicites à tes variables...

                Là où je crains le pire, c'est quand tu dis avoir gardé une instance de Graphics quelque part. C'est quelque chose qu'il faut éviter à tout prix quand on ne sait pas ce qu'on fait. Je dis toujours : on ne dessine que et seulement que dans la méthode paintComponent, qui elle fournit un objet Graphics valable !
                Après, effectivement quand on progresse et qu'on comprend ce qu'on manipule (car Swing est vraiment pas chose facile), là on peut créer des objets Graphics d'une certaine manière, mais bon ça me semble de toute manière inutile dans ton application (ça sert surtout dans les jeux ce dont je parle).

                Enfin bon courage je suis du même avis que jonkille, à savoir tout reprendre à zéro dans la programmation fenêtrée, si tu ne veux pas t'enfoncer encore plus.
                • Partager sur Facebook
                • Partager sur Twitter
                  23 juin 2009 à 11:56:25

                  Je sais que la meilleure solution serait de recréer une nouvelle interface en propre, mais le problème est qu'il s'agit d'un projet que je dois terminer rapidement. Je suis donc assez pressé par le temps.
                  J'ai arranger les erreurs que tu m'a dites.
                  Ce que j'obtiens à l'affichage est une représentation très simpliste d'un étage d'un immeuble ( principalement des objets drawRect)
                  et ma classe corefonctionnel me permet de faire une simulation et la méthode Draw d'afficher en quelque sorte une représentation graphique du résultat.
                  Voici une partie de mon code sur l'interface ( j'ai fait un grand ménage ) :
                  package InterfaceGraphique;
                  
                  import java.awt.Dimension;
                  import java.awt.Font;
                  import java.awt.event.*;
                  import javax.swing.*;
                  import java.util.ArrayList;
                  import java.io.*;
                  
                  public class InterfaceGraphique extends JPanel  {
                  
                      private CoreFonctionnel.CoreFonctionnel cf;
                      private JFrame fenetre;
                      private JPanel batiment;
                      private JPanel etage;
                      private JTabbedPane onglets;
                      private JButton avancer;
                  
                  
                      public InterfaceGraphique(CoreFonctionnel.CoreFonctionnel cf) {
                  
                          fenetre = new JFrame();
                          onglets = new JTabbedPane();
                          batiment = new JPanel();
                          etage = new JPanel ();
                  		avancer = new JButton("Avancer");
                          
                          this.cf = cf;
                  
                          fenetre.add(onglets);
                    
                  
                  
                  		fenetre.add(avancer);
                          avancer.setBounds(270, 510, 100, 30);
                  
                          avancer.addActionListener(new ActionListener() {
                              public void actionPerformed( ActionEvent evt) {
                                  avancerActionPerformed(evt);
                              }
                          });
                    
                          onglets.addTab("Batiment", batiment);
                          onglets.addTab("etage", etage);
                          fenetre.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                          fenetre.setSize(600,600);
                          fenetre.getContentPane().add(onglets);
                          fenetre.setVisible(true);
                      }
                      public void dessin (CoreFonctionnel.CoreFonctionnel corf, JPanel pan){
                          pan.setLayout(null);
                          corf.Draw(0, pan.getGraphics());
                          pan.add(corf);
                  
                      }
                  
                      private void avancerActionPerformed(ActionEvent evt) {
                          this.dessin(cf,batiment);
                    
                          if (secondes <=9 && minutes <=9) {
                              chrono.setText("0"+minutes+":0"+secondes);
                          } else if (minutes <=9){
                              chrono.setText("0"+minutes+":"+secondes);
                          } else if (secondes <=9  ) {
                              chrono.setText(minutes+":0"+secondes);
                          } else {
                                chrono.setText(minutes+":"+secondes);
                          }
                  
                          secondes+=5;
                  
                          if(secondes==60){
                              minutes+=1;
                              secondes=0;
                          }
                          cf.Step();
                  
                      }
                  


                  Et donc mon problème reste toujours le fait qu'il m'affiche mon objet cf sur mes deux onglets (bâtiment et étage ).
                  • Partager sur Facebook
                  • Partager sur Twitter
                    23 juin 2009 à 15:03:59

                    bon j'ai récupéré internet alors je te dirais que j'aimerais bien voir corefonctionnel et que ton problème doit venir de dessin()
                    • Partager sur Facebook
                    • Partager sur Twitter
                      23 juin 2009 à 16:12:34

                      ok je te file la fonction CoreFonctionnel mais je suis pas sur que sa t'aide
                      package CoreFonctionnel;
                      
                      import Structure.*;
                      import java.awt.Graphics;
                      import java.io.*;
                      import java.util.*;
                      import javax.swing.JPanel;
                      
                      /**
                       *
                       * @author yp
                       */
                      public class CoreFonctionnel extends JPanel implements Serializable, Calculable {
                          private List<EnsembleDePiece> immeuble;
                          private String name;
                          private int nbPers_etage;
                      
                          public CoreFonctionnel() {
                              immeuble = new ArrayList<EnsembleDePiece>();
                              name = "Nom par default";
                              Init();
                          }
                          /**
                           * @param xmlfile Nom du fichier XML à parser
                           * Constructeur lisant un fichier XML (parseur)
                           */
                          public CoreFonctionnel(String xmlfile) {
                              Init();
                              throw new UnsupportedOperationException("TODO");
                          }
                      
                          public String getName() {
                              return name;
                          }
                          public void setName(String name) {
                              this.name = name;
                          }
                      
                          public void Load(String filename) {
                              try{
                                  FileInputStream file = new FileInputStream(filename);
                                  ObjectInputStream ois = new ObjectInputStream(file);
                                  CoreFonctionnel me = (CoreFonctionnel) ois.readObject();
                                  this.immeuble = me.immeuble;
                                  this.name = me.name;
                              }
                              catch (FileNotFoundException ex) {
                                  System.out.println("Fichier non trouvé");
                              }
                              catch (IOException ex) {
                                  System.out.println("Erreur d'entrée-Sortie");
                              }
                              catch (ClassNotFoundException ex) {
                                  System.out.println("Demander à Java d'arrêter de fumer");
                              }
                              Init();
                          }
                          public void Save(String filename) {
                              try{
                                  FileOutputStream file = new FileOutputStream(filename);
                                  ObjectOutputStream oos = new ObjectOutputStream(file);
                                  oos.writeObject(this);
                              }
                              catch (java.io.IOException ex) {
                                  System.out.println("Erreur d'entrée-Sortie");
                              }
                          }
                      
                          public void Add(EnsembleDePiece e){
                              immeuble.add(e);
                          }
                      
                          /**
                           *
                           * @param id identifiant de l'étage à dessiner
                           * @param g contexte graphique sur lequel dessiner
                           */
                      
                          public void Draw(int id, Graphics g){
                              for (Iterator<EnsembleDePiece> it = immeuble.iterator(); it.hasNext();) {
                                  EnsembleDePiece ensemble = it.next();
                                  if (ensemble.getId()== id){
                                      ensemble.draw(g);
                                  }
                              }
                          }
                      
                      
                          public boolean Step() {
                              System.out.println("Début d'un cycle de calcul");
                              boolean result = true;
                              Init();
                              while (result) {
                                  result = false;
                                  for (Iterator<EnsembleDePiece> it = immeuble.iterator(); it.hasNext();) {
                                      EnsembleDePiece ensembleDePiece = it.next();
                                      result = ensembleDePiece.Step() || result;
                                  }
                              }
                              System.out.println("Fin d'un cycle de calcul");
                              return false;
                          }
                          private int nb;
                          private int nb1;
                          public int get_nb_imm (){
                              System.out.println("get"+nb);
                              return nb;
                      
                          }
                      
                          public void set_nb_imm (int nb){
                              this.nb = nb;
                          }
                          public void Init() {
                              
                              for (Iterator<EnsembleDePiece> it = immeuble.iterator(); it.hasNext();) {
                                  EnsembleDePiece ensembleDePiece = it.next();
                                  ensembleDePiece.Init();
                                  
                                  this.nb1 += ensembleDePiece.getNbpersBatiment();
                              }
                              set_nb_imm(nb1);
                              System.out.println(nb1);
                              this.nb1=0;
                          }
                      
                      }
                      

                      Ensuite dans la classe EnsembleDePiece j'ai la méthode draw suivante
                      public void draw(Graphics g) {
                             nb_pers=0;
                              for (Iterator<Piece> it = elements.iterator(); it.hasNext();) {
                                  Piece element = it.next();
                                  nb = element.getNbpers();
                                  element.draw( g);
                                  nb_pers = nb +nb_pers;
                              }
                              for (Iterator<EnsembleDePiece> it = ensembles.iterator(); it.hasNext();) {
                                  EnsembleDePiece ensemble = it.next();
                                  ensemble.draw(g);
                                  nb2 =ensemble.getNbpersBatiment();
                                  nb_pers+= nb2;
                              }
                             System.out.println(nb_pers);
                          }
                      


                      Et voici la méthode de dessin pour l'affichage d'une pièce
                      @Override public void draw(Graphics g) {
                      		if (getNbpers() > (2*getCapmax()/3)){
                      			g.setColor(Color.RED);
                      		} else if (getNbpers() == 0) {
                                  g.setColor(Color.WHITE);
                              } else if (getNbpers() < (getCapmax()/3)){
                      			g.setColor(Color.GREEN);
                      		} else {
                      			g.setColor(Color.ORANGE);
                      		}
                              g.fillRect(getPref().x, getPref().y, getLongueur(), getLargeur());
                              g.setColor(Color.BLACK);
                              g.drawRect(getPref().x, getPref().y, getLongueur(), getLargeur());
                          }
                      
                      • Partager sur Facebook
                      • Partager sur Twitter
                        23 juin 2009 à 17:59:48

                        Moi à mon avis le pan.getGraphics() est plus que douteux.
                        Tu sais que la méthode peut renvoyer null ?
                        Et que le Graphics change relativement souvent ?
                        C'est pas très propre tout ça mais bon si t'es buté ben bon courage.
                        • Partager sur Facebook
                        • Partager sur Twitter
                          23 juin 2009 à 21:05:50

                          Après en avoir discuté avec mon chef de projet, on a décidé de suivre vos conseils et de recoder entièrement l'interface. Du coup je dois tout recoder pour demain ;)

                          merci d'avoir accorder du temps à mon problème
                          bonne soirée
                          • Partager sur Facebook
                          • Partager sur Twitter
                            23 juin 2009 à 21:24:30

                            Ok ravi que tu le prennes comme cela.
                            Essaie de suivre les conseils livrés dans le tuto Java de ce site. Ils sont relativement de bonne facture pour débuter.

                            Il n'y a pas forcément tout à refaire dans ton code actuel, juste la gestion des composants et de l'affichage.

                            Et n'hésite pas à poser des questions on sera sûrement ravis de te répondre.

                            Bonne soirée.
                            • Partager sur Facebook
                            • Partager sur Twitter
                              24 juin 2009 à 8:18:03

                              Désolé mais un virus attaque l'entreprise donc les serveurs web étaient fermés pour éviter la contamination *arf*

                              Bonne décision en effet et bonne chance. T'en as pas pour longtemps à refaire un truc propre mais comme tu débutes évites les méthodes utilisant les graphics. Ce concept est pour utilisateurs un peu plus avancé je trouve, il existe d'autres méthodes.
                              • Partager sur Facebook
                              • Partager sur Twitter

                              Problème d'onglet étonnant

                              × 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