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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juillet 2008
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 26
    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
    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
    Membre averti
    Inscrit en
    Juillet 2008
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 26
    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
    Membre averti
    Inscrit en
    Juillet 2008
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 26
    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
    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
    Membre averti
    Inscrit en
    Juillet 2008
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 26
    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à!

+ Répondre à la discussion
Cette discussion est résolue.

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