IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Agents de placement/Fenêtres Java Discussion :

Affichage d'une image de fond sur une JFrame


Sujet :

Agents de placement/Fenêtres Java

  1. #1
    Futur Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 26
    Points : 8
    Points
    8
    Par défaut Affichage d'une image de fond sur une JFrame
    Bonjour,

    Je suis en train de coder un clavier virtuel pour mon stage. J'ai eu l'idée, au lieu de mettre des gros boutons moches partout, de mettre une image au fond de ma frame et de récupérer les coordonnées d'un point cliqué pour interpréter une touche du clavier. mon problème vient de l'affichage de cette image. J'ai cherché des exemple et de l'aide sur tous les forum que cette galaxie a pu produire et une fois que j'ai trouvé une solution qui me satisfaisait, je l'ai implémentée. Seulement...marche po!

    Me voila donc pour trouver l'aide de quelqu'un qui connait Java (ou je suis moi même ce qu'on appelle communément une grosse quille) qui pourrait inspecter mon code et me dire ce qui ne passe pas. Le compilateur ne me trouve ni erreur, ni warning.

    Voici le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
    import java.awt.Container;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;
    import javax.imageio.ImageIO;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
     
    public class FenetreFrame extends JFrame {
        private Container c;
        private JPanel imagePanel;
        private String filePath;   //adresse de l'objet (je m'en sers dans le main)
     
     
        public FenetreFrame(String filePath) {
     
            super("Image de fond");
            this.filePath = filePath;
     
            try {
                jbInit();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
     
        private void jbInit() throws Exception {
            this.getContentPane().setLayout( null );
            this.setSize( new Dimension(800, 195) );
            this.setTitle( "Suncard Family" );
            setDefaultCloseOperation(EXIT_ON_CLOSE);
            c = getContentPane();
            imagePanel = new JPanel() {
                   @Override public void paintComponent(Graphics g) {
                        try {
                            super.paintComponent(g);
                            Graphics2D g2D=(Graphics2D)g;
                            BufferedImage image = ImageIO.read(new File(filePath));
                            g2D.drawImage(image,0,0,null);
                            } catch (IOException e) {
                                e.printStackTrace();
                                }
                    }
            };
                            imagePanel.setPreferredSize(new Dimension(800, 195));
                            c.add(imagePanel);
        }
     
     
    }
    Puis voici mon main:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public class Program {
    /* 
     public Program() {}
    */
        public static void main(String[] args) {
            String imagePath = "C:/Documents and Settings/Yann Gueganic/Mes documents/Developpement/Projets JDeveloper/Clavier_Virtuel/Clavier_Virtuel/Clavier_facile.jpg";
            FenetreFrame fond = new FenetreFrame(imagePath);
            fond.pack();
            fond.setVisible(true);
        }
    }
    Voila....si vous me trouvez une solution je vous offre un an de bain-douche, un voyage au kazakhstan et des bons de reduction prisu! on dit merciiiiiiiiii! lol!

    non, merci a vous par avance pour vos reponses.

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Il ne faut pas charger une image à partir d'un fichier dans paintComponent. Tu bloque l'EDT, le Thread unique chargé de gérer l'interface graphique. En plus, paintComponent est appelé très souvent, donc tu vas charger ton image autant de fois
    Voici le code modifié :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;
     
    import javax.imageio.ImageIO;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
     
    public class FenetrePanel extends JPanel
    {
    	public static void main( String[] args ) throws IOException
    	{
    		FenetrePanel fond = new FenetrePanel( "clavier.jpg" );
    		JFrame frame = new JFrame();
    		frame.getContentPane().add( fond );
    		frame.pack();
    		frame.setVisible( true );
    	}
     
    	private BufferedImage fondImg;
     
    	public FenetrePanel( String filePath ) throws IOException
    	{
    		fondImg = ImageIO.read( new File( filePath ) );
    	}
     
    	@Override
    	public Dimension getPreferredSize()
    	{
    		return new Dimension( fondImg.getWidth(), fondImg.getHeight() );
    	}
     
    	@Override
    	protected void paintComponent( Graphics g )
    	{
    		super.paintComponent( g );
    		g.drawImage( fondImg, 0, 0, this );
    	}
    }
    La classe de gestion devient un JPanel et non plus une JFrame. C'est plus flexible. Si un jour tu veut ajouter des fonctionnalités, ton clavier visuel ne change pas. En plus, le JPanel se retaille dynamiquement en fonction de l'image. Maintenant, on peut imaginer qu'en plus de ton image, tu vas gérer un fichier texte qui contient les coordonnées des touches, avec pourquoi pas le nom de la méthode à appeler.
    bon courage !
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  3. #3
    Futur Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 26
    Points : 8
    Points
    8
    Par défaut
    hello encore!

    J'ai essayé ton code et ca colle pour la classe mais j'ai un probleme dans le main (j'ai vraiment reparti tout le programme dans des classes differentes pour que ca soit plus simple a utiliser pour les techniciens quand je ne serai plus la). J'ai créé une nouvelle classe pour le panel, et ai patché le code dedans, pas de probleme. Par contre, dans le main, j'ai une erreur du type: "unreported exception: class java.io.IOException; must be caught or declared to be thrown", a la ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FenetrePanel fond = new FenetrePanel( "clavier.jpg" );
    Ca doit certainement venir du fait que mes classes soient séparées et qu'il ne peut pas atteindre un objet. Vois tu le probleme? Mes questions ont certainement l'air bete, je debute en Java.

    Pour les touches, j'ai procédé de la facon suivante: une classe Touche qui contient les coordonnées et le caractere de la touche, une classe qui contient un tableau contenant toutes les touches, et enfin ma fenetre qui va gerer la souris et l'affichage. Je n'ai pas encore attaqué les "details" (taille fixée, position sur l'ecran fixée, barre de menu, etc.).

    En tous cas merci pour ton aide, ca commencais a devenir un peu comme ca=>

  4. #4
    Futur Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 26
    Points : 8
    Points
    8
    Par défaut
    heu juste une precision pour pas avoir l'air trop bete, j'ai essayé de changer la chaine "clavier.jpg" avec le nom de mon fichier, mais ca passe pas non plus.

    et une autre question, comment le programme trouvera t-il le fichier correspondant (qui est a la racine du dossier de mon projet)?

  5. #5
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Pour l'erreur "IOException", je t'encourage à rechercher dans les tutoriels et les cours relatifs aux exceptions. Pour faire simple, le constructeur ne gère pas "IOException" (throws IOException à la fin de la signature du constructeur) et j'ai fais de même avec la méthode "main". Pour déclarer le Panel, il faut faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    FenetrePanel fond = null;
    try
    {
      fond = new FenetrePanel( "clavier.jpg" );
    }
    catch( IOException exc )
    {
      ... gerer l'exception ici, décider si le programme continue ou pas ...
    }
    Ensuite, pour le problème du chemin de l'image, tu remets simplement celui que tu utilisais au départ.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  6. #6
    Futur Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 26
    Points : 8
    Points
    8
    Par défaut
    re hello!

    J'ai du un pti peu anticiper ta reponse puisque j'ai mangé hier apres midi 3 cours sur les exceptions....maintenant je sais a quoi ca sert au moins...

    Sinon, j'ai essayé ton bout de code en rajoutant un println dans la structure catch pour voir si il y avait un probleme (phrase un peu idiote puisque si je suis en train d'ecrire en ce moment c'est qu'il y a un probleme). J'ai lancé en debug et mon probleme semble venir du container (c'est en tous cas quand il execute cette classe que le programme saute).

    Voila mon erreur:
    Exception in thread "main" java.lang.NullPointerException
    at java.awt.Container.addImpl(Container.java:1015)
    at java.awt.Container.add(Container.java:351)
    at clavier_virtuel.Program.main(Program.java:24)
    Process exited with exit code 1.
    On touche au but, là!

  7. #7
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Il faudrait le code de "Program", mais j'imagine que le fichier image n'a pas été trouvé, et que la variable FenetrePanel est null. Ensuite tu essais d'ajouter la variable null à la JFrame, ce qui est interdit.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  8. #8
    Membre éclairé

    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 510
    Points : 803
    Points
    803
    Par défaut
    bonjour

    Juste une chose personnellement je prefere ajouter a la JFrame un JLabel et non pas un JPanel... tout simplement parce que on peut faire setIcon() sur un JLabel...

    en clair , il suffit de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    JLabel monClavier = new JLabel();
    monClavier.setIcon("monImage.jpg");
    maJFrame.add(monClavier);
    "La seule chose dont je sois certain, c'est que je doute"
    j'ai cassé ma boule de cristal veuillez être clair et précis dans vos propos
    compilateur - 1 nayah - 0
    PS : je suis un

  9. #9
    Futur Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 26
    Points : 8
    Points
    8
    Par défaut
    Hello!

    Alors, pour commencer, voila le code de Program (qui est en fait mon main):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    public class Program {
     
        public static void main(String[] args) {
            //new FenetreFrame();
            FenetrePanel fond = null;
     
            try{
                fond = new FenetrePanel( "C:/Documents and Settings/Yann Gueganic/Mes documents/Developpement/Projets JDeveloper/Clavier_Virtuel/Clavier_Virtuel/Clavier_facile.jpg" ); 
            }
            catch(IOException e){
                System.out.println("Probleme");
            }
            finally{
            JFrame frame = new JFrame();
            frame.getContentPane().add( fond );
            frame.pack();
            frame.setVisible( true );
            }
     
     
        }
    }
    A propos de l'image, est ce qu'il faut juste lui donner le chemin de l'image ou juste son nom ou la mettre à un endroit precis (tu va me dire les trois). Parce qu'avec la fonction File(), tu crée un fichier (si j'ai bien compris) mais on lui donne en parametre l'adresse d'un objet. Il faudrait lui envoyer un type, non?

    Concernant ta proposition nolofinwe, je ne suis pas contre si c'est simple à utiliser. Mon seul imeratif est mon systeme de detection des touches par coordonnées. C'est une application qui va etre utilisée pour faire du commerce, il faut donc qu'il soit parfaitement stable.

    En tous cas merci beaucoup de m'aider, mon tuteur de stage est en vacances donc c'est un pti peu la jungle...

  10. #10
    Futur Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 26
    Points : 8
    Points
    8
    Par défaut
    wouhouuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu!!!!!!!!!!!!!

    en fait ca marche, j'avais fait une faute de frappe dans l'adresse de l'image. c'est bon, j'ai ma frame avec mon image dedans. Ca roule.... Bon ben il me reste plus qu'a ajouter le reste du code et voir si ca fonctionne comme il faut.

    Merci beaucoup a vous deux pour votre interet et particulierement à dinobogan pour ton code et ta patience (si si, je comprend vite mais il faut m'expliquer longtemps).

  11. #11
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Citation Envoyé par nashpimp Voir le message
    A propos de l'image, est ce qu'il faut juste lui donner le chemin de l'image ou juste son nom ou la mettre à un endroit precis (tu va me dire les trois). Parce qu'avec la fonction File(), tu crée un fichier (si j'ai bien compris) mais on lui donne en parametre l'adresse d'un objet. Il faudrait lui envoyer un type, non?
    Il faut lui donner le chemin complet de l'image, en absolu ou relatif. Après peu importe l'endroit ou tu mets l'image. Mais pense au déploiement : si tu créés un jar avec l'image à l'intérieur, on n'y accède pas simplement comme pour un fichier.
    Pour le type de fichier, tu parles du format (jpeg, bmp, png...) ? L'objet ImageIO se charge de tout pour la lecture de l'image dans le fichier.

    Concernant ta proposition nolofinwe, je ne suis pas contre si c'est simple à utiliser. Mon seul imeratif est mon systeme de detection des touches par coordonnées.
    La solution avec le JLabel n'est pas viable dans ton cas. Il faut que tu détecte les clics souris, et en plus, dans un second temps, je suppose qu'il va falloir faire des animations lorsqu'une touche est cliquées (l'encadrer par exemple) ?

    EDIT : trop lent
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  12. #12
    Membre éclairé

    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 510
    Points : 803
    Points
    803
    Par défaut
    dinobogan ? je ne saisi pas , on peut toujours récupérer les coordonnées d'un clilc meme sur un Jlabel non ?

    rien n'empeche de faire un addMouseListener ... pourquoi n'est ce pas viable ?
    "La seule chose dont je sois certain, c'est que je doute"
    j'ai cassé ma boule de cristal veuillez être clair et précis dans vos propos
    compilateur - 1 nayah - 0
    PS : je suis un

  13. #13
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Citation Envoyé par nolofinwe Voir le message
    dinobogan ? je ne saisi pas , on peut toujours récupérer les coordonnées d'un clilc meme sur un Jlabel non ?

    rien n'empeche de faire un addMouseListener ... pourquoi n'est ce pas viable ?
    Tu as raison, "pas viable" est un peu trop fort.
    Voici mon point de vue : le JLabel est un JComponent qui n'est pas prévu pour répondre aux événements. Par contre, le JPanel, oui. Pour afficher une simple image, JLabel simplifie grandement le travail, puisqu'on n'a pas a redéfinir une méthode etc... Par contre, la ou ça devient compliqué, c'est lorsqu'on doit modifier l'image. Et la, le JLabel n'est pas du tout prévu pour ça. D'où l'idée du JPanel : on peut modifier l'image comme on veut, conserver une image de fond statique et faire les traitements sur une seconde image qui sera appliquée sur l'image de fond. Dans le cas du post, on peut imaginer que le besoin suivant soit d'entourer la lettre sur laquelle se trouve la souris... faire des animations.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  14. #14
    Membre éclairé

    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 510
    Points : 803
    Points
    803
    Par défaut
    en théorie je suis d'accord avec toi mais la on ne veut pas modifier mais repérer a quel endroit on a cliqué

    voila pourquoi j'ai proposé ca, tant que je le peux j'évites aux maximum de surcharger une méthode
    "La seule chose dont je sois certain, c'est que je doute"
    j'ai cassé ma boule de cristal veuillez être clair et précis dans vos propos
    compilateur - 1 nayah - 0
    PS : je suis un

  15. #15
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Citation Envoyé par nolofinwe Voir le message
    en théorie je suis d'accord avec toi mais la on ne veut pas modifier mais repérer a quel endroit on a cliqué

    voila pourquoi j'ai proposé ca, tant que je le peux j'évites aux maximum de surcharger une méthode
    C'est pas faux
    Mais je pense souvent au futur
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  16. #16
    Membre éclairé

    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 510
    Points : 803
    Points
    803
    Par défaut
    c'est une bonne chose d'anticiper parfois... mais pour un clavier virtuel... ce n'est pas forcement utile
    "La seule chose dont je sois certain, c'est que je doute"
    j'ai cassé ma boule de cristal veuillez être clair et précis dans vos propos
    compilateur - 1 nayah - 0
    PS : je suis un

  17. #17
    Futur Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 26
    Points : 8
    Points
    8
    Par défaut
    rebonjour rebonjouuuuur!!!!

    Branle bas de combat, y a un probleme!

    Alors, j'ai fait fonctionner le code comme suit: en créant la frame avec juste l'image au fond. Le souci, c'est que maintenant, j'ai inseré mon code à l'interieur (celui qui me permet de gerer toutes les fonctionnalités). Il devient alors tout rouge et m'annonce la meme erreur que precedemment...sur la meme ligne qu'avant. Je vous poste mon code complet, ca va faciliter les choses...

    ma classe Touche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    public class Touche {
    //------------------ Variables diverses -----------------------
        double point1;
        double point2;
        double point3;
        double point4;
        char caractere;
        int fleche;
    //------------------------------------------------------------
     
    //------------------------------------------------------------
    //-------- Constructeurs des Touches -------------------------
    //------------------------------------------------------------
        public Touche(double Xmin, double Xmax, double Ymin, double Ymax, 
                                                                        char carac){  
               point1 = Xmin; 
               point2 = Xmax;  
               point3 = Ymin; 
               point4 = Ymax;
               caractere = carac;
            }
     
        public Touche(double Xmin, double Xmax, double Ymin, double Ymax, int flec){  
               point1 = Xmin; 
               point2 = Xmax;  
               point3 = Ymin; 
               point4 = Ymax;
            }
    //---------------------------------------------------------------
     
    //---------------------------------------------------------------
    //------------------------- Methodes ----------------------------
    //---------------------------------------------------------------
     
        public double SortirCompoConstr1(){
           return point1; 
        }
     
        public double SortirCompoConstr2(){
           return point2; 
        }
     
        public double SortirCompoConstr3(){
           return point3; 
        }
     
        public double SortirCompoConstr4(){
           return point4; 
        }
     
     
        public char SortirCompoConstrCarac(){
           return caractere; 
        }
     
        public int SortirCompoConstrFlec(){
           return fleche; 
        }
    }

    Ma Classe Poupulation de Touches:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    public class PopTouche {
    //------------------------- Creation du Tableau -------------------------
        Touche tabTouche[] = new Touche[47];
     
    //----------------------------- Constructeur -----------------------------
        public PopTouche() {
          //cette classe ne construit pas d'objet. elle est juste le contenant
            //de toutes les touches créées
        }
     
    //-----------------------------------------------------------------------
    //---------------------------- Touches ----------------------------------
    //-----------------------------------------------------------------------
     
      //------------------ Lettres ------------------------------
        Touche ToucheA = new Touche(100,150,40,78,'A');
        Touche ToucheB = new Touche(300,350,116,154,'B');
        Touche ToucheC = new Touche(200,250,116,154,'C');
        Touche ToucheD = new Touche(200,250,78,116,'D');
        Touche ToucheE = new Touche(200,250,40,78,'E');
        Touche ToucheF = new Touche(250,300,78,116,'F');
        Touche ToucheG = new Touche(300,350,78,116,'G');
        Touche ToucheH = new Touche(350,400,78,116,'H');
        Touche ToucheI = new Touche(450,500,40,78,'I');
        Touche ToucheJ = new Touche(400,450,78,116,'J');
        Touche ToucheK = new Touche(450,500,78,116,'K');
        Touche ToucheL = new Touche(500,550,78,116,'L');
        Touche ToucheM = new Touche(550,600,78,116,'M');
        Touche ToucheN = new Touche(350,400,116,154,'N');
        Touche ToucheO = new Touche(500,550,40,78,'O');
        Touche ToucheP = new Touche(550,600,40,78,'P');
        Touche ToucheQ = new Touche(100,150,78,116,'Q');
        Touche ToucheR = new Touche(250,300,40,78,'R');
        Touche ToucheS = new Touche(150,200,78,116,'S');
        Touche ToucheT = new Touche(300,350,40,78,'T');
        Touche ToucheU = new Touche(400,450,40,78,'U');
        Touche ToucheV = new Touche(250,300,116,154,'V');
        Touche ToucheW = new Touche(100,150,116,154,'W');
        Touche ToucheX = new Touche(150,200,116,154,'X');
        Touche ToucheY = new Touche(350,400,40,78,'Y');
        Touche ToucheZ = new Touche(150,200,40,78,'Z');
     
        //---------------- Caracteres Spéciaux ----------------------
        Touche ToucheSlash = new Touche(500,550,116,154,'/');// /
        Touche ToucheEtoile = new Touche(550,600,116,154,'*');//*
        Touche TouchePlus = new Touche(600,650,2,40,'+');// +
        Touche ToucheEgale = new Touche(600,650,2,40,'=');// =
        Touche ToucheMoins = new Touche(600,650,2,40,'-');// -
     
        //------------------ Chiffres -----------------------------
        Touche Touche1 = new Touche(100,150,2,40,'1');  
        Touche Touche2 = new Touche(150,200,2,40,'2');  
        Touche Touche3 = new Touche(200,250,2,40,'3');  
        Touche Touche4 = new Touche(250,300,2,40,'4');  
        Touche Touche5 = new Touche(300,350,2,40,'5');  
        Touche Touche6 = new Touche(350,400,2,40,'6');  
        Touche Touche7 = new Touche(400,450,2,40,'7');  
        Touche Touche8 = new Touche(450,500,2,40,'8');  
        Touche Touche9 = new Touche(500,550,2,40,'9');  
        Touche Touche0 = new Touche(550,600,2,40,'0');  
     
        //---------------- Touches Spéciales ---------------------
        Touche ToucheEspace = new Touche(200,500,154,193,' ');  //Espace
        Touche ToucheBackSpace = new Touche(650,750,2,40, (char)0x08);  //Effacer
        Touche ToucheEnter = new Touche(650,700,40,154,(char)0x0D);  //Entree
        Touche ToucheFleHaut = new Touche(700,750,116,154,KeyEvent.VK_UP);  //Fleche Haut
        Touche ToucheFleBas = new Touche(700,750,154,193,KeyEvent.VK_DOWN);   //Fleche Bas
        Touche ToucheFleGauc = new Touche(650,700,154,193,KeyEvent.VK_LEFT);  //Fleche gauche
        Touche ToucheFleDroit = new Touche(750,800,154,193,KeyEvent.VK_RIGHT);  //Fleche Droite*/
        //----------------------------------------------------------------------
     
    //----------------------------------------------------------------------   
    //---------------- Initialisation du tableau tabTouche -----------------
    //----------------------------------------------------------------------
         {                               
            this.tabTouche[0] = ToucheA;
            this.tabTouche[1] = ToucheB;
            this.tabTouche[2] = ToucheC;
            this.tabTouche[3] = ToucheD;
            this.tabTouche[4] = ToucheE;
            this.tabTouche[5] = ToucheF;
            this.tabTouche[6] = ToucheG;
            this.tabTouche[7] = ToucheH;
            this.tabTouche[8] = ToucheI;
            this.tabTouche[9] = ToucheJ;
            this.tabTouche[10] = ToucheK;
            this.tabTouche[11] = ToucheL;
            this.tabTouche[12] = ToucheM;
            this.tabTouche[13] = ToucheN;
            this.tabTouche[14] = ToucheO;
            this.tabTouche[15] = ToucheP;
            this.tabTouche[16] = ToucheQ;
            this.tabTouche[17] = ToucheR;
            this.tabTouche[18] = ToucheS;
            this.tabTouche[19] = ToucheT;
            this.tabTouche[20] = ToucheU;
            this.tabTouche[21] = ToucheV;
            this.tabTouche[22] = ToucheW;
            this.tabTouche[23] = ToucheX;
            this.tabTouche[24] = ToucheY;
            this.tabTouche[25] = ToucheZ;
            this.tabTouche[26] = ToucheSlash;
            this.tabTouche[27] = ToucheEtoile;
            this.tabTouche[28] = TouchePlus;
            this.tabTouche[29] = ToucheEgale;
            this.tabTouche[30] = ToucheMoins;
            this.tabTouche[31] = Touche1;
            this.tabTouche[32] = Touche2;
            this.tabTouche[33] = Touche3;
            this.tabTouche[34] = Touche4;
            this.tabTouche[35] = Touche5;
            this.tabTouche[36] = Touche6;
            this.tabTouche[37] = Touche7;
            this.tabTouche[38] = Touche8;
            this.tabTouche[39] = Touche9;
            this.tabTouche[40] = Touche0;
            this.tabTouche[41] = ToucheEspace;
            this.tabTouche[42] = ToucheBackSpace;
            this.tabTouche[43] = ToucheEnter;
            this.tabTouche[44] = ToucheFleHaut;
            this.tabTouche[45] = ToucheFleBas;
            this.tabTouche[46] = ToucheFleGauc;
            this.tabTouche[47] = ToucheFleDroit;
        }
    //----------------------------------------------------------------
     
    //---------------------------------------------------------------
    //------------------------- Methodes ----------------------------
    //---------------------------------------------------------------
     
        public int QuelleTouche(Point pointfonc, Touche[] tabTouchefonc){
         int i;
     
         for(i=0; i<=53; i++){
            if((pointfonc.getX()>tabTouchefonc[i].point1)&&
                        (pointfonc.getX()<tabTouchefonc[i].point2)&&
                                (pointfonc.getY()>tabTouchefonc[i].point3)&&
                                        (pointfonc.getY()<tabTouchefonc[i].point4))
     
                break;
         }
         return i;
        }
    //---------------------------------------------------------------
     
     
    }
    Ma classe Fenetre Panel:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    public class FenetrePanel extends JPanel{
     
        private BufferedImage fondImg;
        Point point = SortirPoint();
        Touche[] tabTouche= new Touche[47];
        PopTouche popToucheFen = new PopTouche();
     
     
     
        public FenetrePanel(String filePath) throws IOException{
     
                fondImg = ImageIO.read( new File(filePath) );
        }
     
        public FenetrePanel() {
            try {
                jbInit();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
     
     
        private void jbInit() throws Exception {
            this.addMouseListener(new MouseAdapter() {
                        public void mouseClicked(MouseEvent e) {
                            this_mouseClicked(e);
                        }
                    });
        }
     
        private void this_mouseClicked(MouseEvent e) {
            point = e.getPoint();
        }
     
     
        @Override
        public Dimension getPreferredSize()
        {
            return new Dimension( fondImg.getWidth(), fondImg.getHeight() );
        }
     
        @Override
        protected void paintComponent( Graphics g )
        {
                super.paintComponent( g );
                g.drawImage( fondImg, 0, 0, this );
        }
     
    //----------------------------------------------------------------  
    //------- Methodes pour les coordonnées --------------------------
    //----------------------------------------------------------------
        public Point SortirPoint() {
        return point;    
        }    
    //---------------------------------------------------------------
     
    //---------------------------------------------------------------
    //------------- Methode d'affichage du caractere ----------------
    //---------------------------------------------------------------
        public void Affichage(int indice, Touche tabToucheFonc[]){
            indice = popToucheFen.QuelleTouche(point,tabTouche);             
     
                    if(indice==43){
                        System.out.print(tabToucheFonc[indice].caractere);
                        System.out.print(0x0A);
                    }
     
                    else
                        System.out.print(tabToucheFonc[indice].caractere);
     
        }   
    //---------------------------------------------------------------
     
     
    }
    Ma classe Program contenant le main:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    public class Program {
     
        public static void main(String[] args) {
            FenetrePanel fond = null;
     
            try{
                fond = new FenetrePanel( "C:/Documents and Settings/" +
                    "Yann Gueganic/Mes documents/Developpement/Projets JDeveloper/"+
                            "Clavier_Virtuel/Clavier_Virtuel/Clavier_facile.jpg" ); 
            }
            catch(IOException e){
                System.out.println("Probleme");
            }
            finally{
            JFrame frame = new JFrame();
            frame.setTitle( "Suncard Family" );
            frame.setResizable(false);
            frame.getContentPane().add( fond );
            frame.pack();
            frame.setVisible( true );
            }
     
     
        }
    }
    Il me trouve des problemes dans la classe Container (que je ne peux pas toucher) et dans ma classe Program à la ligne "frame.getContentPane().add( fond );". En fait la je comprend vraiment pas le probleme...autant avant j'imaginais, mais la.... M'enfin, apres ca, fini le java, je retourne faire du C.

  18. #18
    Membre éclairé

    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 510
    Points : 803
    Points
    803
    Par défaut
    ne te décourage pas le java c'est puissant crois moi

    essai pour afficher ton image de faire comme je t'ai dis... avec un JLabel et regarde si il te renvois la meme erreur...
    "La seule chose dont je sois certain, c'est que je doute"
    j'ai cassé ma boule de cristal veuillez être clair et précis dans vos propos
    compilateur - 1 nayah - 0
    PS : je suis un

  19. #19
    Futur Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 26
    Points : 8
    Points
    8
    Par défaut
    hello!

    nolofinwe, je viens d'essayer ta technique avec le label, et....j'ai une erreur de compilation. Bon, je me suis peut etre planté en codant puisque j'ai essayé de creer mon label rapidement sans créer de classe propre. Voici mon main:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    public class Program {
     
        public static void main(String[] args) {
           /* FenetrePanel fond = null;
            
            try{
                fond = new FenetrePanel( "C:/Documents and Settings/" +
                    "Yann Gueganic/Mes documents/Developpement/Projets JDeveloper/"+
                            "Clavier_Virtuel/Clavier_Virtuel/Clavier_facile.jpg" ); 
            }
            catch(IOException e){
                System.out.println("Probleme");
            }
            finally{*/
           JLabel fond = new JLabel();
           fond.setIcon("C:/Documents and Settings/Yann Gueganic/Mes documents/Developpement/Projets JDeveloper/Clavier_Virtuel/Clavier_Virtuel/Clavier_facile.jpg" );
     
     
     
     
            JFrame frame = new JFrame();
            frame.setTitle( "Suncard Family" );
            frame.setResizable(false);
            frame.add(fond);
            //frame.getContentPane().add( fond );
            frame.pack();
            frame.setVisible( true );
            //}
     
     
        }
    l'erreur trouvée par le compilateur est a la ligne "fond.setIcon("C:/Documents and Settings/[...]/Clavier_facile.jpg" );" où il me dit :"'setIcon(String) cannot invoke' 'setIcon(javax.swing.Icon)' in JLabel". Je pense que j'appelle pas la fonction de la bonne façon, mais je ne sais pas comment faire...

    Et autre question, est ce qu'avec le label, la fentre sera dimensionnée a la taille de l'image automatiquement?

  20. #20
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Le problème vient de ton "finally" dans la classe "Program". Il ne faut pas l'utiliser ici. "finally" s'exécute toujours, même lorsque l'exception associée est levée. Or, là, elle est levée mais le finally t'empêche de le voir. Supprime ce finally et tu t'aperçois qu'il y a une exception qui était cachée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 47
    	at devcom.claviervirtuel.PopTouche.<init>(PopTouche.java:128)
    	at devcom.claviervirtuel.FenetrePanel.<init>(FenetrePanel.java:20)
    	at devcom.claviervirtuel.Program.main(Program.java:16)
    Tu tentes d'accéder au 47eme éléments d'un tableau qui fait... 47 cases
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Image en fond sur une Userform
    Par potters dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 12/06/2007, 14h17
  2. Jlabel sur une image de fond est ce possible?
    Par jlassiramzy dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 04/05/2007, 12h29
  3. Image de fond sur une JFrame et dans une JToolBar
    Par FredPsy dans le forum Agents de placement/Fenêtres
    Réponses: 9
    Dernier message: 01/02/2007, 18h12
  4. Affichage d'une image de fond sur un site
    Par eugiragal dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 20/12/2006, 18h43
  5. problème d'affichage d'un menu sur une image de fond
    Par Nata31 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 23/06/2006, 07h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo