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

Interfaces Graphiques en Java Discussion :

Background d'un JPanel


Sujet :

Interfaces Graphiques en Java

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2010
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2010
    Messages : 119
    Points : 39
    Points
    39
    Par défaut Background d'un JPanel
    Bonjour à tous!

    Je bosse un petit projet en graphique... Et je me rends compte d'un étrange phénomène...

    Voici ma classe, qui gère l'affichage de ma fenètre :
    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
     
    import java.awt.Color;
    import java.awt.Dimension;
     
    import javax.swing.*;
     
     
    public class Test {
     
    	/**
             * @param args
             */
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub 
    		JFrame fenetre = new JFrame();
    		//BoxLayout layout = new BoxLayout(fenetre.getContentPane(), BoxLayout.Y_AXIS);
    		//fenetre.getContentPane().setLayout(layout);
    		fenetre.setBackground(Color.gray);
    		fenetre.getContentPane().setPreferredSize(new Dimension(200, 700));		
            fenetre.setLocationRelativeTo(null);
            fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		LeverView levier = new LeverView();
    		fenetre.getContentPane().add(levier);
    		//JPanel pan = new JPanel();
    		//pan.setSize(200,100);
    		//pan.setBackground(Color.green);
    		//fenetre.add(pan);
    		fenetre.pack();
     
    		fenetre.setVisible(true);
    		fenetre.setResizable(false);
    	}
     
    }
    et le constructeur de la classe LeverView :

    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
     
    	public LeverView(){
    		this.setOpaque(true);
    		this.setBackground(Color.red);
    		this.setSize(200, 600);
    		this.model = new LeverModel(this);
    		this.controle = new LeverControl(this.model); 
    		this.addMouseMotionListener(new MouseMotionListener(){
     
    			public void mouseDragged(MouseEvent e) {
    				controle.lever(e);
    			}
     
    			public void mouseMoved(MouseEvent e) {
     
    			}
    		});
    	}

    Eh bien à l'affichage de ma fenêtre, mon LeverView, qui hérite de JPanel, qui est donc censé etre opaque et rouge, n'affiche pas son background. Les seuls changements de couleur que l'on peut observer sont ceux de la JFrame.

    Deplus si je décommente les dernière ligne de la première classe que je vous ai citée, toute ma JFrame est verte...

    Suis-je le seul à trouve ça étrange?

    Merci en tout cas!

  2. #2
    Modérateur
    Avatar de XxArchangexX
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mars 2012
    Messages
    1 159
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mars 2012
    Messages : 1 159
    Points : 2 323
    Points
    2 323
    Par défaut
    Oui :p.

    1/ Retire :

    set opaque il me semble met sa propre couleur en backgournd.

    setBackground suffit pour mettre en red opaque.

    2/ Le layout manager par défaut d'une JFrame est le BorderLayout. Donc quand tu décommentes pan prend la place de letterview.

    Essaye :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    fenetre.add(levier,BorderLayout.CENTER);
    fenetre.add(pan,BorderLayout.SOUTH);
    3/ Pour ce qui est de la taille, je ne sais plus exactement comment il fonctionne mais c'est le pack() qui modifie le rendu que tu veux car il compact les tailles pour respecter les preferred size mais je ne suis plus certain.

    Rien n'est un étrange phénomène dans ce monde .
    L'Etat est bien administré quand l'escalier de l'école est usé et que l'herbe croît sur celui du tribunal.

    Modérateur BI

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2010
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2010
    Messages : 119
    Points : 39
    Points
    39
    Par défaut
    En fait le Pan était juste un Jpanel pour un test, j'ai même pas besoin de layout vu que ma fenêtre n'a pas à être "sizable", je peux tout insérer via les coordonnées...

    Par contre, j'ai enlevé le "setOpaque"... Et... Mon LeverView prends toujours comme couleur de background, celle de ma Jframe

  4. #4
    Modérateur
    Avatar de XxArchangexX
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mars 2012
    Messages
    1 159
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mars 2012
    Messages : 1 159
    Points : 2 323
    Points
    2 323
    Par défaut
    Interessant si personne ne voit je regarde ce soir pour test et je te tiens au courant.

    Pour un petit test, dans ton JPanel leverView peux tu rajouter un JLabel avec un texte,n'importe, pour vérifier si c'est la couleur qui bug ou si c'est ton panel qui n'est pas ajouter à ta fenêtre.
    L'Etat est bien administré quand l'escalier de l'école est usé et que l'herbe croît sur celui du tribunal.

    Modérateur BI

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2010
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2010
    Messages : 119
    Points : 39
    Points
    39
    Par défaut
    Re! Merci de t'occuper de moi
    Mon LeverView est bien ajouté à ma fenètre, car voici sa méthode paintcomponent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    	public void paintComponent(Graphics g){
    		//Dessine la poignee du levier
    		g.clearRect(0, 0, 200, 600);
    		g.setColor(Color.black);
    		g.fillRect(20, this.model.getOrd(), 100, 40);
    		//indicateur 0
    		g.setColor(model.getCouleurZero());
    		g.fillRect(5,415,10,10);
    	}
    Et tous les motifs que j'y peins sont bien présents dans ma fenêtre...

    Mais le problème doit venir de moi, puisque avec ma nouvelle classe, ça déconne encore plus. Je te file le code, d'abord de ma nouvelle classe, puis de la gestion de ma Jframe... Désolé ça fait un peu de lecture :
    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
     
    import java.awt.Color;
    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 RunTest extends JPanel implements Runnable{
     
    	private LeverView levier;
    	private Image image;
     
    	public RunTest(LeverView levier){
    		this.levier=levier;
    		try
            {
                this.image = ImageIO.read(new File("ecran.png"));
            }
            catch (IOException e)
            {
                this.image = null;
                System.out.println("Fichier invalide");
            }
    	}
     
    	public void paintComponent(Graphics g){
    		//Dessine la poignee du levier
    		g.setColor(Color.black);
    		g.fillRect(20, 20, 50, 100);
    		g.drawImage(this.image, 0, 0, this);
    	}
     
     
    	public void run() {
    		// TODO Auto-generated method stub
    		while(true){
    		try {
    			Thread.sleep(30);
    			System.out.println("Vitesse :" + levier.getModel().getVitesse(0.03f));
    		} catch (InterruptedException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		}
    	}
     
     
    }
    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
     
    import java.awt.Color;
    import java.awt.Dimension;
     
    import javax.swing.*;
     
     
    public class Test {
     
    	/**
             * @param args
             */
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub 
    		JFrame fenetre = new JFrame();
    		fenetre.getContentPane().setLayout(null);
    		fenetre.setBackground(Color.yellow);
    		fenetre.getContentPane().setPreferredSize(new Dimension(974, 600));		
            fenetre.setLocationRelativeTo(null);
            fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		LeverView levier = new LeverView();
    		fenetre.getContentPane().add(levier);
    		levier.setLocation(774, 0);
    		RunTest cadran = new RunTest(levier);
    		fenetre.getContentPane().add(cadran);
    		cadran.setLocation(0,0);
    		fenetre.pack();
     
    		Thread t= new Thread(new RunTest(levier));
    		t.start();
     
    		fenetre.setVisible(true);
    		fenetre.setResizable(false);
    	}
     
    }
    J'ai donc, mon LeverView à droite, avec un setBackground(Color.red), ma jFrame avec un setBackground(Color.yellow) et enfin ma nouvelle classe, qui est censée peindre sur elle-même une image à la dimension exacte du Jpanel (il n'y a pas d'erreur lors du chargement de l'image) et qui sinon a un setBackground(Color.blue). De plus il devrait y avoir un rectangle noir... Et j'obtiens :



    ... Je ne comprends vraiment pas ce que je fais de mal, je ne me souviens pas avoir eu de tels problèmes...

    Merci de votre aide.

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2010
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2010
    Messages : 119
    Points : 39
    Points
    39
    Par défaut
    Alors j'ai peut être un élément qui peut aider à trouver le soucis, dans ma classe Test, où il y a mon main, si j'ajoute à "fenetre.setBackground(Color.yellow)" la ligne "fenetre.getContentPane().setBackground(Color.magenta)", j'obtiens ceci...



    ... Donc on voit le ContentPane, a gauche, la Jframe à droite...
    Pourtant, sur la partie droite, mon LeverView (qui extend JPanel) est bien affiché, sauf son background...
    Et sur la partie gauche, rien ne s'affiche...

    Je deviens fou ><

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2010
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2010
    Messages : 119
    Points : 39
    Points
    39
    Par défaut
    Bon, j'ai trouvé une "solution momentannée", plutot que de "setbackground" mon levier, je peins un rectangle dessus... Tant pis...

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Août 2004
    Messages : 30
    Points : 43
    Points
    43
    Par défaut
    Citation Envoyé par Alba.1337 Voir le message
    Bon, j'ai trouvé une "solution momentannée", plutot que de "setbackground" mon levier, je peins un rectangle dessus... Tant pis...

    Tu as fait un patch quoi

Discussions similaires

  1. Mettre une image en Background d'un JPanel et d'une JList
    Par diabli73 dans le forum Composants
    Réponses: 8
    Dernier message: 29/01/2010, 15h35
  2. [JPanel] background image
    Par benderSobre dans le forum Agents de placement/Fenêtres
    Réponses: 9
    Dernier message: 02/07/2008, 21h12
  3. JDialog qui prend le background de mon JPanel
    Par LoLoLem dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 10/12/2007, 11h09
  4. [débutant] image de background pour un JPanel
    Par thiouwz dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 06/11/2006, 15h49
  5. Changer le background (image) d'un JPanel
    Par citizenM dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 30/05/2006, 00h49

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