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

 Java Discussion :

Affichage en arrière plan dans une fenêtre Jframe


Sujet :

Java

  1. #1
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Mai 2017
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2017
    Messages : 19
    Par défaut Affichage en arrière plan dans une fenêtre Jframe
    Bonjour,
    Débutant dans la programmation JAVA, j'ai réalisé un début de programme d'affichage d'objets. J'obtiens une fenêtre Jframe 1920*1200 composée de divers "curseurs" déplaçables sur fond noir.
    J'ai effectué énormément de recherches pour trouver la solution adéquat à mon problème : afficher en "fond d'écran" une image .png. Le soucis principal est que cette image doit bien être en arrière plan par rapport aux autres "ObjetsJeux". Et je ne trouve pas de méthode/classe résolvant mon problème.
    Etant nouveau sur ce genre de forum je n'ai pas trouvé d'autre solutions que de vous mettre mon code en PJ.
    Merci d'avance pour vos réponses.

    Curseur.java.txt
    Fenetre.java.txt
    Handler.java.txt
    ID.java.txt
    Jeux.java(Main).txt
    KeyInput.java.txt
    ObjetJeux.java.txt

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 483
    Par défaut
    Il suffit de prendre un JPanel, de redéfinir sa méthode paintComponent pour y faire le dessin (avec un simple Graphics.drawImage), et ensuite de mettre tous les autre composants dans ce panel.

  3. #3
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Mai 2017
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2017
    Messages : 19
    Par défaut
    Voilà comment j'ai modifié ma classe Fenetre :

    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 jeux;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import java.awt.Dimension;
     
    public class Fenetre extends JFrame {
     
    	private static final long serialVersionUID = 3823162937106336209L;
     
    	public Fenetre (int longueur, int largeur, String titre, Jeux jeux){
     
    		JFrame fenetre = new JFrame(titre);
    		fenetre.setUndecorated(true);
    		fenetre.setPreferredSize(new Dimension(longueur, largeur));
    		fenetre.setMaximumSize(new Dimension(longueur, largeur));
    		fenetre.setMinimumSize(new Dimension(longueur, largeur));
    		fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		fenetre.setResizable(false);
    		fenetre.setLocationRelativeTo(null);
    		fenetre.add(jeux);
    		fenetre.setAlwaysOnTop(true);
    		fenetre.setVisible(true);
     
    		JPanel panel = new JPanel();
    		this.setContentPane(panel);
    		this.setVisible(true);
    	    this.setContentPane(new Fond());
     
    		jeux.start();
    	}
    }
    Et voilà donc la classe Fond :
    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 jeux;
    import java.awt.Graphics;
    import java.awt.Image;
    import java.io.File;
    import java.io.IOException;
     
    import javax.imageio.ImageIO;
    import javax.swing.JPanel;
     
    public class Fond extends JPanel { 
     
    	private static final long serialVersionUID = 2290215993065771323L;
     
    	public void paintComponent(Graphics g){
    		    try {
    		      Image img = ImageIO.read(new File("C:/Users/Askiarsh/Desktop/eclipse/jeux/src/jeux/img/earth_map_ocean_continents_1920x1200.jpg"));
    		      g.drawImage(img, 0, 0, this);
    		    } catch (IOException e) {
    		      e.printStackTrace();
    		    }                
    	 }
    }
    La classe Main reste inchangée.
    Je n'obtiens néanmoins ni erreurs ni résultat : toujours une fenêtre à fond coloré (avec mes curseurs déplaçables).

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 483
    Par défaut
    Oula, tu mélange des choses là:

    Ton constructeur Fenetre.... crèe une deuxième JFrame séparée qu'il affiche. Déjà ce n'est pas bon. Ensuite, dans ce constructeur, tu définis allègrement certaines choses sur Fenetre (le Fond), d'autres sur le JFrame que tu viens de créer (la taille, le jeux, la visibilité). Résultat, ton Fond est appliqué sur un objet séparé, après le setVisible et probablement dans une fenetre de taille 0x0 pixels cachée derrière ton autre fenetre que tu as défini comme always on top.

    Donc
    1) retirer ce new JFrame, il n'a pas de raison d'être
    2) définir le contentPane (setContentPane) avant d'ajouter d'autres objet. Sinon ils seront ajoutés à l'ancien ContentPane
    3) définir taille et autres sur l'objet Fenetre lui même.
    4) ce ne devrait pas être la responsabilité de la fenêtre de démarrer le jeu, mais de l'appelant

    Ce qui devrait donner un truc du style:

    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
    public Fenetre (int longueur, int largeur, String titre, Jeux jeux){
     
        super(titre);
        setUndecorated(true);
        setPreferredSize(new Dimension(longueur, largeur));
        setMaximumSize(new Dimension(longueur, largeur));
        setMinimumSize(new Dimension(longueur, largeur));
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setResizable(false);
        setLocationRelativeTo(null);
        setContentPane(new Fond());
        add(jeux);
        setAlwaysOnTop(true);
        setVisible(true);
    }

  5. #5
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Mai 2017
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2017
    Messages : 19
    Par défaut
    Merci pour les explications (claires).
    J'ai effectué les modifications comme précédemment indiqué : ma fenêtre affiche donc maintenant l'image sur Fenetre (dans le bon JFrame donc). Cependant les curseurs ont disparus. Faut il alors que je les ajoute comme composants de la Jframe Fenetre (avec quelle méthode?). Pourtant la méthode render (dans la main class "Jeux") faisait très bien son boulot avant ... j'aimerais comprendre ce qui a changé
    Merci d'avance pour vos réponses.

  6. #6
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 483
    Par défaut
    je n'ai pas regardé ton code d'avant. Pour ajouter des composants dans le panel, il faut lui donner un layout et et utiliser les methodes add() du panel. Comme n'importe quel composant swing en somme.

  7. #7
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Mai 2017
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2017
    Messages : 19
    Par défaut
    Sauf que je ne peux pas appliquer la méthode add à un composant comme mes Curseur ... Une idée ?
    faut il que je code ma classe curseur autrement ?

  8. #8
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 483
    Par défaut
    Citation Envoyé par Askiarsh Voir le message
    Sauf que je ne peux pas appliquer la méthode add à un composant comme mes Curseur ... Une idée ?
    faut il que je code ma classe curseur autrement ?
    Tu peux appeler tes renders depuis paintComponent, mais ce n'est pas franchement comme ça que swing est conçu. Tes classes curseur n'acceptent aucunE interaction, ne s'adaptent pas à la taille de la fenêtre et ne se branchent pas facilement sur un modèle de donnéeS. ne tiennent pas compte des bounds du Graphics. Il représentent quoi tes curseurs? Il existe déjà un composant JSlider si c'est ce que tu désire.

  9. #9
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Mai 2017
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2017
    Messages : 19
    Par défaut
    Les curseurs sont de simples carrés de couleurs qui se déplaceront sur une carte (la fameuse image Fond). Selon la région sur laquelle ils s'arrêteront (et si les utilisateurs la sélectionne), divers actions s'enclencheront. Je ne connais pas les Jsliders mais je me renseigne.
    EDIT : du coup non, les slider ne correspondent pas à ce que je veux faire.

  10. #10
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 483
    Par défaut
    dans ce cas, t'as deux possibilités en gros:

    dessiner les curseur sur l'image de fond: sympa mais tu dois gérer les clics & co à la main, calculer si le clic est dans le coordonées, etc. Dans ce cas, il suffit de faire appel au code de dessin du curseur depuis paintComponent

    créer des des composant curseur, sur le même principe que le fond, et les positionner dans le panel Fond avec add() + retirer le layoutmanager + positionner manuellement avec setBounds. Peut être un peu chiant à placer, mais t'as directement le support pour les clics, le redessin en cas de move, etc.

  11. #11
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Mai 2017
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2017
    Messages : 19
    Par défaut
    Voilà la classe Fenetre modifiée :

    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
    package jeux2;
    import javax.swing.JFrame;
    import java.awt.Dimension;
    
    public class Fenetre extends JFrame {
    
    	private static final long serialVersionUID = 3823162937106336209L;
    	
    	public Fenetre (int longueur, int largeur, String titre, Jeux jeux){
    		super(titre);
    	    setUndecorated(true);
    	    setPreferredSize(new Dimension(longueur, largeur));
    	    setMaximumSize(new Dimension(longueur, largeur));
    	    setMinimumSize(new Dimension(longueur, largeur));
    	    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	    setResizable(false);
    	    setLocationRelativeTo(null);
    	    setContentPane(new Fond());
    	    setLayout(null);
    	    Curseur curseur = new Curseur();
    	    curseur.setBounds(0,0,100,100);
    	    add(curseur);
                add(jeux);
    	    setAlwaysOnTop(false);
    	    setVisible(true);
    	}
    }
    Et la classe Curseur qui correspond :
    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
     package jeux2;
    import java.awt.Component;
    import java.awt.Graphics;
    import java.awt.Image;
    import java.io.File;
    import java.io.IOException;
     
    import javax.imageio.ImageIO;
     
     
    public class Curseur extends Component{
     
    	private static final long serialVersionUID = 8868691716373117721L;
     
    		public void paintComponent(Graphics g){
    		    try {
    		    	Image img = ImageIO.read(new File("C:/Users/Askiarsh/Desktop/eclipse/jeux2/src/jeux2/img/test.png"));
    			    g.drawImage(img, 100, 100, this);
    		    } catch (IOException e) {
    		      e.printStackTrace();
    		    }
    		}
    	}
    En gros j'essaye pour le moment juste d'afficher une seconde image par dessus la seconde. Si je peux faire ça j'aurais pas de soucis à changer l'image en rectangle qui écoute les key enfoncées et relachées.
    Pourtant rien ne s'affiche d'autre dans ma fenetre que l'objet de la classe Fond...

    EDIT : j'ai changé curseur.setBounds(0,0,100,100);
    par : curseur.setBounds(0,0,this.getWidth(),this.getHeight()); à tout hasard ... mais non.

  12. #12
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 483
    Par défaut
    1) g.drawImage(img, 0, 0, this);
    car les coordonnées sont toujours relatives au composant

    2) c'est JComponent qu'il faut étendre, pas Component. On ne mélange pas AWT et swing, le système de rendu est différent. Tu l'aurais vu si tu avais pensé à mettre @Override comme annotation de ta méthode.

  13. #13
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Mai 2017
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2017
    Messages : 19
    Par défaut
    Merci des réponses. Je clos le sujet ... mais je promet pas de pas en créer un autre sur le même projet dans peu de temps :p

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 08/10/2014, 13h56
  2. Photo en arrière plan dans une JFrame
    Par misswatson dans le forum NetBeans
    Réponses: 5
    Dernier message: 21/05/2011, 23h11
  3. Changer la couleur d'arrière plan d'une fenêtre MDI.
    Par tssi555 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 22/10/2008, 15h27
  4. Affichage d'un JLabel dans une popup (JFrame)
    Par mattyeux dans le forum Agents de placement/Fenêtres
    Réponses: 17
    Dernier message: 05/02/2007, 16h17

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