Partage
  • Partager sur Facebook
  • Partager sur Twitter

{JAVA}afficher les composants

problème affichage une image avec les composants

Sujet résolu
    2 avril 2007 à 15:39:24

    salut mes amis je n'arrive pas à comprendre et trouver le problème , je voulais bien afficher image sur l'interface avec les composant de cette interface
    le pb que les composants ne parraitent pas sur la fenetre JFrame seullent l'image charger
    voila le code


    package aa;
    import javax.swing.*;
    import java.awt.*;
    import java.io.*;
    import java.lang.*;
    import java.sql.*;
    import java.awt.GridBagConstraints;
    import java.awt.GridBagLayout;
    import java.awt.Insets;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.HashMap;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPasswordField;
    import javax.swing.JTextField;
    import java.awt.Dimension;


    public class SimpleFenetre extends JFrame {
    private JTextField tfLogin = new JTextField();

    private JLabel nom= new JLabel("nom :");
    private JTextField nomn = new JTextField();
    private JLabel  photo =new JLabel("photo");
    private String image = "C:\\Documents and Settings\\BE\\Bureau\\a.jpg";

    private JButton Ok = new JButton("OK");
    private GridBagLayout gbl = new GridBagLayout();
    private JLabel lbLogin = new JLabel("Login : ");

    public void paint(Graphics arg0) {
        arg0.drawImage(Toolkit.getDefaultToolkit().getImage(image),0,0,this);

          }


      public SimpleFenetre() {

        super("Login");
        this.getContentPane().setLayout(gbl);
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.fill = GridBagConstraints.NONE;
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.weightx = 1;
        gbc.weighty = 1;
        gbc.gridwidth = 1;
        gbc.gridheight = 1;
        gbc.insets = new Insets(50, 40, 0, 30);
        tfLogin.selectAll();
       
        gbl.setConstraints(this.lbLogin, gbc);
        this.getContentPane().add(this.lbLogin);

        gbc.insets = new Insets(50, 0, 0, 50);
        gbc.gridx = 1;
        gbc.weightx = 5;
        gbl.setConstraints(this.tfLogin, gbc);
        tfLogin.setPreferredSize(new Dimension(120, 25));
        this.getContentPane().add(this.tfLogin);

        this.setResizable(false);
        this.setSize(520, 620);
        this.setLocationRelativeTo(null);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


        this.setVisible(true);

      }

      public static void main(String[] args) {

       SimpleFenetre gui = new SimpleFenetre();

     }

     
              }


    je voulais que les composants apparaitent sur la fenetre
    • Partager sur Facebook
    • Partager sur Twitter
      2 avril 2007 à 16:46:17

      tu as essayer en mettant un Container sur ta fenêtre et tes composants sur ce Container (genre Panel ou JPanel...).
      • Partager sur Facebook
      • Partager sur Twitter
        2 avril 2007 à 17:40:34

        C'est normal que tes composants n'apparaisent pas si tu ne les ajoutent pas dans ta frame :p
        • Partager sur Facebook
        • Partager sur Twitter
          2 avril 2007 à 20:38:01

          sisi, ces composants devrais apparaitre. Seulement le paint va se faire par dessus. Donc creer une classe MonImage ou tu affiche l'image dans un panel puis ajoute ce panel :)
          • Partager sur Facebook
          • Partager sur Twitter
            3 avril 2007 à 9:44:31



            package aa;
            import javax.swing.*;
            import java.awt.*;
            import java.io.*;
            import java.lang.*;
            import java.sql.*;
            import java.awt.event.ActionEvent;
            import java.awt.event.ActionListener;
            import java.util.HashMap;


            public class SimpleFenetre extends JFrame {
            private JTextField tfLogin = new JTextField();

            private JLabel nom= new JLabel("nom :");
            private JTextField nomn = new JTextField();
            private JLabel  photo =new JLabel("photo");
            private String image = "C:\\Documents and Settings\\BE\\Bureau\\a.jpg";

            private JButton Ok = new JButton("OK");
            private GridBagLayout gbl = new GridBagLayout();
            private JLabel lbLogin = new JLabel("Login : ");

            public void paint(Graphics arg0) {
                super.paint(arg0);
                arg0.drawImage(Toolkit.getDefaultToolkit().getImage(image),0,0,this);

                  }


              public SimpleFenetre() {

                super("Login");
                this.getContentPane().setLayout(gbl);
                GridBagConstraints gbc = new GridBagConstraints();
                gbc.fill = GridBagConstraints.NONE;
                gbc.gridx = 0;
                gbc.gridy = 0;
                gbc.weightx = 1;
                gbc.weighty = 1;
                gbc.gridwidth = 1;
                gbc.gridheight = 1;
                gbc.insets = new Insets(50, 40, 0, 30);
                tfLogin.selectAll();
               
                gbl.setConstraints(this.lbLogin, gbc);
                this.getContentPane().add(this.lbLogin);

                gbc.insets = new Insets(50, 0, 0, 50);
                gbc.gridx = 1;
                gbc.weightx = 5;
                gbl.setConstraints(this.tfLogin, gbc);
                tfLogin.setPreferredSize(new Dimension(120, 25));
                this.getContentPane().add(this.tfLogin);

                this.setResizable(false);
                this.setSize(520, 620);
                this.setLocationRelativeTo(null);
                this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


                this.setVisible(true);
                this.repaint();
              }

              public static void main(String[] args) {

               SimpleFenetre gui = new SimpleFenetre();

             }

             
                      }


            Salut.

            Petite remarque dans tes 'import', lorsque tu fais un
            import java.awt.*;

            tu n'est pas obligé de faire des
            import java.awt.NomClass;


            Sinon ton problème est le suivant :
            Tu utilises un composant JFrame graphique pour lequel l'affichage se fait dans un Container qui implemente la fonction paint(Graphics g).
            En fait quand tu fait un paint dans ta JFrame ce qu'il se passe c'est que la machine virtuelle va chercher à exécuter la méthode getContentPane().paint(Graphics g) de ta JFrame. (getContentPane() renvoie le container utilisé pour ta JFrame).
            Il en va de même pour la méthode add(Container c) ... qui exécute getContentPane().add(Container c), à la différence d'une petite marge (pour la gestion de la barre de la fenêtre).

            Bref quand tu ajoutes un composant à ta JFrame tu l'ajoutes en réalité au ContentPane, et quand tu peint ta JFrame tu repeint ton ContentPane.
            Hors le ContentPane est un Container et il contient déja une méthode paint(Graphics g) que tu écrase dans ta classe.

            Donc quand tu vas peindre ta fenetre par:

            this.setVisible;(true)
            this.repaint();

            Il est intéressant d'effectuer un repaint()... après le setVisible(true)

            la méthode sous jacente paint(Grphics g) appelée par ces fonctions va etre celle que tu a écrite toi !!!!

            hors la méthode paint(Graphics g) de ton ContentPane est justement la méthode qui va dessiner tes composants dans ta fenetre. (Dans un container, la méthode paint va peindre tous les composant ajoutés à ce container)

            Il faut donc que dans ta méthode paint(Graphics g) tu fasses un super.paint(g) pour qu'avant de peindre ton image, le container affiche les composants.

            Quand tu souhaites surcharger une méthode non abstraite d'une classe dont tu hérites il est préférable de faire commencer le code de cette méthode pas super.nomMethode(arguments) pour éviter ce genre de comportement !
            • Partager sur Facebook
            • Partager sur Twitter
              4 avril 2007 à 16:23:41

              merci pour cette information mais le problème persiste encore j'ai ajouté
              this.repaint(); mais ça n'a pas marché j'ai toujours les comosant qui n'affiche pas sur la fenetre
              je n'ai pas encore résoudre le problème
              • Partager sur Facebook
              • Partager sur Twitter
                4 avril 2007 à 21:11:08

                1/ essai d'enlever ta méthode paint() dans laquelle tu affiche ton image

                => si les composants ne s'affichent toujours pas alors vérifie tous tes add, setLayout et tout...

                => si les composants s'affiche passe à 2

                2/ remet ta méthode paint avec la ligne "super.paint(Graphics g)" au début

                => si ca ne marche pas passe en 3

                3/ place le "super.paint(Graphics g)" à la fin de ta méthode paint()

                => si ca ne marche toujours pas passe en 4

                4/ ecrit juste :

                public void paint(Graphics g) {
                    super.paint(g);
                }


                => si ca marche c'est que tu fais trop de repaint() ou de rafraichissement de ta jframe dans ton programme et qu'en en faisant moins alors 3/ ou 2/ vont marcher en prenant soins de faire moins de rafraichissements !!!!

                tiens moi au courrant ... c'est un problème qui m'avait beaucoup embeté dans le temps avant de me plonger plus profondément dans le fonctionnement de java.awt et javax.swing

                PS il est souvent interressant de tester le comportement de son programme avec un setLayout(null) !!! en placant juste un composant dans ta fenetre
                • Partager sur Facebook
                • Partager sur Twitter
                  5 avril 2007 à 13:58:35

                  merci ami , je coince encore car je n'arrive pas à comprendre le pb de mon code j'ai bien suivi les étapes que tu m'as sité mais ça ne marche pas ,est ce que il y a une autre méthode qui me permet d'aficher l'image a la place de la méthode paint car elle me fatigue
                  j'ai remis la méthode a la première ligne


                  public void paint(Graphics arg0) {
                      super.paint(arg0);
                      arg0.drawImage(Toolkit.getDefaultToolkit().getImage(image),0,0,this);

                        }
                  public SimpleFenetre() {

                      super("Login");

                  puis à la fin mais toujours le pb

                  j'ai modifié le code



                  package aa;
                  import javax.swing.*;
                  import java.awt.*;
                  import java.io.*;
                  import java.lang.*;
                  import java.sql.*;
                  import java.awt.event.ActionEvent;
                  import java.awt.event.ActionListener;
                  import java.util.HashMap;


                  public class SimpleFenetre extends JFrame {
                  private JTextField tfLogin = new JTextField();

                  private JLabel nom= new JLabel("nom :");
                  private JTextField nomn = new JTextField();
                  private JLabel  photo =new JLabel("photo");


                  private JButton Ok = new JButton("OK");
                  private GridBagLayout gbl = new GridBagLayout();
                  private JLabel lbLogin = new JLabel("Login : ");
                  ImageIcon icon = new ImageIcon("C:\\Documents and Settings\\BE\\Bureau\\a.jpg");
                           


                    public SimpleFenetre() {
                   
                  icon.getImage();
                  this.getContentPane.setIcon(icon);

                      this.getContentPane().setLayout(gbl);
                      GridBagConstraints gbc = new GridBagConstraints();
                      gbc.fill = GridBagConstraints.NONE;
                      gbc.gridx = 0;
                      gbc.gridy = 0;
                      gbc.weightx = 1;
                      gbc.weighty = 1;
                      gbc.gridwidth = 1;
                      gbc.gridheight = 1;
                      gbc.insets = new Insets(50, 40, 0, 30);
                      tfLogin.selectAll();

                      gbl.setConstraints(this.lbLogin, gbc);
                      this.getContentPane().add(this.lbLogin);
                        gbc.insets = new Insets(50, 0, 0, 50);
                      gbc.gridx = 1;
                      gbc.weightx = 5;
                      gbl.setConstraints(this.tfLogin, gbc);
                      tfLogin.setPreferredSize(new Dimension(120, 25));
                      this.getContentPane().add(this.tfLogin);

                      this.setResizable(false);
                      this.setSize(520, 620);
                      this.setLocationRelativeTo(null);
                      this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


                      this.setVisible(true);
                   
                    }

                    public static void main(String[] args) {

                     SimpleFenetre gui = new SimpleFenetre();

                   }


                       }

                  mais message d'erreur sur la ligne this.getContentPane.setIcon(icon);
                  "SimpleFenetre.java": cannot resolve symbol: variable getContentPane in class aa.SimpleFenetre at line 31, column 6




                  • Partager sur Facebook
                  • Partager sur Twitter

                  {JAVA}afficher les composants

                  × 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