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

AWT/Swing Java Discussion :

Afficher une image avec swing


Sujet :

AWT/Swing Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 125
    Points : 23
    Points
    23
    Par défaut Afficher une image avec swing
    Salut,

    Je n'arrive pas à charger mon image, j'aimerai que mon image soit chargée à partir d'un autre package du projet ou d'un dossier dans le package de mon appli pour ne pas être embêté par les dépendances, et ça marchait avec javafx mais je n'y arrive pas avec swing.
    j'essaye swing à la place de javafx parce que je ne voulais pas que mon application soit programmée autour de l'interface graphique, je préfère programmer mon interface graphique autour de mon appli. merci de votre aide.

    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
     
    /*
     * To change this license header, choose License Headers in Project Properties.
     * To change this template file, choose Tools | Templates
     * and open the template in the editor.
     */
    package kkmulticlient;
     
     
    import java.net.URL;
    import java.io.*;
     
    import javax.swing.JFrame;
     
    import java.awt.Graphics;
    import java.awt.Image;
    import javax.imageio.ImageIO;
    import javax.swing.JPanel;
     
     
     
    public class GUIThread extends Thread
    {
     
     
        GUIThread()
        {
     
        }
     
        public class Window extends JFrame 
        {
            Background bg = new Background();
            public Window()
            {
                this.setTitle("Maze Fighters");
                this.setSize(288, 512);
                this.setLocationRelativeTo(null);
                this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   
                //this.setUndecorated(true);
                this.add(bg);//, BorderLayout.CENTER);
                this.setVisible(true);
            }
        }
        public class Background extends JPanel 
        {
            public void paintComponent(Graphics g)
            {
                try 
                {
                    //URL url = new URL("/images/loginScreen.png");
                    Image background = ImageIO.read(new File("/images/loginScreen.png"));
                    //g.drawImage(background, 0, 0, this);
                    //Pour une image de fond
                    g.drawImage(background, 0, 0, this.getWidth(), this.getHeight(), this);
                } 
                catch (IOException e) 
                {
                    e.printStackTrace();
                    System.out.println("can't open background image");
                }                
            }               
        }
     
     
        public void run()
        {
            Window window = new Window();
        }
    }

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 125
    Points : 23
    Points
    23
    Par défaut
    D'après mon code je met une jframe et j'essaye d'y ajouté l'image et je commence à peine à tester swing donc je ne connais pas de trop mais je crois qu'il faut que je mette un jpanel entre les deux dans la hiérarchie, j'vais tester ça demain.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 125
    Points : 23
    Points
    23
    Par défaut
    Quelqu'un a un code simple ne serait-ce que pour afficher une image avec java ?
    D'après ce que j'ai compris avec mon code, j'ai juste à ajouté JPanel bg = new Background(); mais j'ai toujours des messages d'erreurs "javax.imageio.IIOException: Can't read input file!" donc j'ai beau essayé n'importe quel code, si mon le programme ne trouve pas l'image, ça sert à rien...

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 125
    Points : 23
    Points
    23
    Par défaut
    ça devrait être un truc plus dans ce genre là mais je ne sais pas comment initialiser (Graphics g)

    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
     
    import java.net.URL;
    import java.io.*;
     
    import javax.swing.JFrame;
     
    import java.awt.Graphics;
    import java.awt.Image;
    import java.awt.image.BufferedImage;
     
    import javax.imageio.ImageIO;
    import javax.swing.JPanel;
     
     
     
    public class GUIThread extends Thread
    {
     
     
        GUIThread()
        {
     
        }
     
        public class Window extends JFrame 
        {
            public Window()
            {
                this.setTitle("Maze Fighters");
                this.setSize(288, 512);
                this.setLocationRelativeTo(null);
                this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   
                //this.setUndecorated(true);
                this.setVisible(true);
            }
        }
     
        public class Background extends JPanel
        {
     
            public Background(Graphics g)
            {
     
                try
                {
                    URL url = getClass().getResource("/images/loginScreen.png");
                    BufferedImage image = ImageIO.read(url);
                    g.drawImage(image, 0, 0, this.getWidth(), this.getHeight(), this);
                }
                catch (IOException e) 
                {
                    e.printStackTrace();
                    System.out.println("can't open background image");
                }            
     
            }
        }
     
        public void run() //Graphics g)
        {
            JFrame GUI = new Window();
            //JPanel background = new Background(g);
        }
     
    }

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 125
    Points : 23
    Points
    23
    Par défaut
    bon ben j'ai réussi.

    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
     
    import java.net.URL;
    import java.io.*;
     
    import javax.swing.JFrame;
     
    import java.awt.Graphics;
    import java.awt.Image;
    import java.awt.image.BufferedImage;
     
    import javax.imageio.ImageIO;
    import javax.swing.JPanel;
     
     
     
    public class GUIThread extends Thread
    {
     
     
        GUIThread()
        {
     
        }
     
        public class Window extends JFrame 
        {
            public Window()
            {
                this.setTitle("Maze Fighters");
                this.setSize(288, 512);
                this.setLocationRelativeTo(null);
                this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   
                //this.setUndecorated(true);
                this.setVisible(true);
            }
        }
     
        public class Background extends JPanel
        {
     
            //public Background()
            //{
     
                public void paintComponent(Graphics g)
                {
                try
                {
                    URL url = getClass().getResource("/images/loginScreen.png");
                    BufferedImage image = ImageIO.read(url);
                    g.drawImage(image, 0, 0, this.getWidth(), this.getHeight(), this);
                }
                catch (IOException e) 
                {
                    e.printStackTrace();
                    System.out.println("can't open background image");
                }    
                }
     
            //}
        }
     
        public void run() //Graphics g)
        {
            JFrame GUI = new Window();
            JPanel background = new Background();
            GUI.add(background);
        }
    }

  6. #6
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Oui cette derniere version (surcharge de paintComponent()) est bien plus correcte que la précédente. Cependant tu devrais invoquer super.paintComponent(g) au tout début de la surcharge de la méthode sinon tu risque d'avoir ces soucis lorsque tu tenteras s'afficher des images semi-transparente ou translucides.

    Pour le reste l'exception que tu citais etait une erreur IO au chargement du fichier donc sans rapport avec l'affichage de l'image.


    Egalement ca serait bien si tu chargeais l'image une seule et unique fois plutôt qu'a chaque nouvel affichage.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 125
    Points : 23
    Points
    23
    Par défaut
    comme ça ?
    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
     
     
     
    public class GUIThread extends Thread
    {
     
     
        public class Window extends JFrame 
        {
            public Window()
            {
                //this.setUndecorated(true);
                this.setTitle("Maze Fighters");
                this.setSize(288, 512);
                this.setLocationRelativeTo(null);
                this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
     
                this.setVisible(true);
            }
        }
     
        public class Background extends JPanel
        {
            public void paintComponent(Graphics g)
            {
                super.paintComponent(g);
     
                try
                {                
                    URL url = getClass().getResource("/images/loginScreen.png");
                    BufferedImage image = ImageIO.read(url);
                    g.drawImage(image, 0, 0, this.getWidth(), this.getHeight(), this);
                }
                catch (IOException e) 
                {
                    e.printStackTrace();
                    System.out.println("can't open background image");
                }     
            }
        }
     
        public class Menu extends JPanel
        {
            JTextField text = new JTextField("blablabla", 10);
        }
     
        public void run() //Graphics g)
        {
            JFrame GUI = new Window();
            GUI.add(new Background());        
        }
    }
    déjà là j'ai un problème, si j'utilise this.setUndecorated(true); mon image disparait et j'ai essayé avec une JWindow, c'est le même résultat.
    de toute façon, il va falloir que je fasse une fonction pour mes images sinon j'ai pas fini... il n'y aurait pas une bibliothèque plus simple et plus stable pour faire un gui ? ou n'importe quelle bibliothèque graphique mais avec des fonctions comme JTextField ? c'est pour faire un jeu mais je n'ai pas spécialement envie d'un framework non plus.
    autant avec javafx je n'avais pas de problèmes mais je devais refaire tout mon code, autant là je n'ai pas à tout refaire mais c'est plutôt décourageant après une première approche, la hiérarchie d'affichage me laisse encore perplexe.

  8. #8
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Ton code est bizarre...

    Aucun soucis pour moi ceci dit avec le mode sans decorations :

    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
    package backgroundtest;
     
    import javax.swing.JFrame;
    import javax.swing.SwingUtilities;
     
    public final class Main {
     
        public static void main(String... args) {
            SwingUtilities.invokeLater(Main::startUIAtEDT);
        }
     
        private static void startUIAtEDT() {
            final JFrame gui = new JFrame();
            gui.setUndecorated(true);
            gui.setTitle("Maze Fighters");
            gui.setSize(288, 512);
            gui.setLocationRelativeTo(null);
            gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            gui.setVisible(true);
            gui.add(new Background());
        }
    }
    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
    package backgroundtest;
     
    import java.awt.Graphics;
    import java.awt.image.BufferedImage;
    import java.io.IOException;
    import java.net.URL;
    import javax.imageio.ImageIO;
    import javax.swing.JPanel;
     
    final class Background extends JPanel {
     
        private BufferedImage image;
     
        public Background() {
            try {
                final URL url = getClass().getResource("/images/loginScreen.png");
                image = ImageIO.read(url);
            } catch (IOException e) {
                e.printStackTrace();
                System.out.println("can't open background image");
            }
        }
     
        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            if (image != null) {
                g.drawImage(image, 0, 0, this.getWidth(), this.getHeight(), this); // En général on passe null ici au lieu de this car on n'utilise pas d'image observer mais bon a toi de voir...
            }
        }    
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    package backgroundtest;
     
    import javax.swing.JPanel;
    import javax.swing.JTextField;
     
    final class Menu extends JPanel {
     
        final private JTextField text = new JTextField("blablabla", 10);
     
        public Menu() {
        }
    }
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 125
    Points : 23
    Points
    23
    Par défaut
    en modifiant mon code un peu comme toi, mon image ne s'affiche même plus. je pige pas, ça m'énerve.
    je ne comprends pas la logique qui fait que pour toi ça fonctionne et moi non.

    mon code est bizarre parce que je regarde des tutos à droite à gauche, je fais des copier-collé, je fais le tri avec ce qui fonctionne ou pas et ensuite j'essaye de codé plus proprement, d'où le code de mon premier post en sachant que j'avais testé javafx juste avant, mais là, franchement, ça me donne pas envie et si il faut surcharger une méthode pour afficher une image dans une bibliothèque de GUI, je suis pas le seul à coder bizarrement lol.
    j'pensais avoir un bon outil sous la main, coder tous les composants en classes et les afficher comme bon me semble dans le runtime mais si quand j'affiche un truc, un autre disparait ou autre, ça n'inspire pas confiance pour la suite.

    je pense pas avoir besoin de invokeLater pour l'instant.
    le thread avec mon gui se lance à un moment où il ne se passe rien normalement et j'ai fait ce thread pour pouvoir utiliser des "workers" ensuite et faire le lien entre le thread et mon gui, et le thread et les info qui arrive du serveur.

    je vais répondre sur mon autre sujet. c'est limite si je préfère pas recoder mon appli pour javafx là... ><

  10. #10
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    invokeLater() est nécessaire pour lancer l'interface sur l'EDT ! Beaucoup de soucis avec Swing proviennent d'une manipulation inadaptée dans des thread pas prévus pour et contrairement à SWT ou FX, Swing ne fait pas les verifs appropriées.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 125
    Points : 23
    Points
    23

Discussions similaires

  1. bleme pour afficher une image avec swing
    Par uzumaki_naruto dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 22/02/2007, 00h47
  2. Afficher une image avec PHP
    Par a_zouggari dans le forum Langage
    Réponses: 2
    Dernier message: 22/04/2006, 18h02
  3. Afficher une image avec opengl
    Par kmaniche dans le forum OpenGL
    Réponses: 4
    Dernier message: 07/02/2006, 09h04
  4. Afficher une image avec swing
    Par arnonote dans le forum AWT/Swing
    Réponses: 11
    Dernier message: 07/08/2004, 12h10
  5. PL/SQL - Comment afficher une image avec HTP ?
    Par patmaba dans le forum PL/SQL
    Réponses: 2
    Dernier message: 08/07/2004, 09h28

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