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 :

[Swing] Ajouter un background de type image


Sujet :

AWT/Swing Java

  1. #1
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    522
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 522
    Par défaut [Swing] Ajouter un background de type image
    Salut,

    J'ai terminé de développer une appli Swing et je dois maintenant ajouter la couche graphique. Etant issue du monde web, j'ai demandé un découpage des images pour chaque bouton et une image représentant le fond d'écran.

    J'ai lu qq liens pour mettre une image en fond d'écran :
    http://www.java2s.com/Code/Java/Swin...roundimage.htm
    http://www.jguru.com/faq/view.jsp?EID=9691

    J'ai réussi à afficher ces exemples, mais à chaque fois, ce sont des images de fond pour 1 JPanel. Or, mon appli est découpée est plusieurs panels. Quelle est la solution ?
    Découper l'image de fond selon chaque panel ?
    Créer un panel global qui contient tous les panels ? (je ne crois pas que ça fonctionne ça)

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par TekP@f Voir le message
    Créer un panel global qui contient tous les panels ? (je ne crois pas que ça fonctionne ça)
    Tu peux très bien faire cela !
    Il faut juste utiliser setOpaque(false) sur les composants contenu à l'intérieur de ton JPanel, afin qu'il ne redessine pas leur propre background...


    a++

  3. #3
    Membre expérimenté Avatar de uhrand
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2009
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 203
    Par défaut
    Citation Envoyé par TekP@f Voir le message
    Quelle est la solution?
    Créer un panel global qui contient tous les panels ? (je ne crois pas que ça fonctionne ça)
    En effet, ce n'est pas toujours évident de rendre transparent tous les éléments de la surface pour pouvoir voir l'image de fond. Tu peux essayer d'utiliser la classe BackgroundPanel qui fais une tentative de rendre transparent les composants qui sont ajoutés au panel. Mais si tu ajoute par exemple une JTable, tu as déjà un problème.

    Comme alternative à l'image de fond, nous pouvons peindre une image semi transparente à l'avant plan, donc sur une couche en dessus de la surface générale. De cette façon on a l'impression que les éléments de la surface son transparents et que l'image se trouve à l'arrière plan, alors qu'en réalité c'est l'inverse. Le désavantage de cette conception est une mauvaise performance pour certaines surfaces complexes.

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    522
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 522
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Salut,

    Tu peux très bien faire cela !
    Il faut juste utiliser setOpaque(false) sur les composants contenu à l'intérieur de ton JPanel, afin qu'il ne redessine pas leur propre background...


    a++
    J'ai justement essayé de le faire. Voici mon code. J'ai un JPanel qui sert d'image de fond. Un autre qui contient des actions simples. Et j'ai toujours l'image de fond qui apparait par dessus le reste.

    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
     
    package tests;
     
    import java.awt.*;
    import javax.swing.*;
     
     
    public class testRiri extends JFrame{
     
    	public testRiri() {
    		setSize(800, 500);
     
    		JPanel panFondEcran = new JPanel();
    		panFondEcran.add(new TestImagePanel(new ImageIcon("images/fond.png").getImage()));
     
    		JPanel panTmp = new JPanel();
    		panTmp.add(new JLabel("Mon label"));
    		JButton toto = new JButton("Suite");
     
    		panTmp.add(toto);
    		panTmp.setOpaque(false);
    		panFondEcran.add(panTmp);
     
    		getContentPane().add(panFondEcran);
    		//getContentPane().add(panTmp);
     
    	}
     
    	public static void main(String args[]) {
    		testRiri objScreen = new testRiri();
    		objScreen.setVisible(true);
    	}
    }
     
    class TestImagePanel extends JPanel {
     
    	private static final long serialVersionUID = 1L;
    	private Image img;
     
    	public TestImagePanel(String img) {
    		this(new ImageIcon(img).getImage());
    	}
     
    	public TestImagePanel(Image img) {
    		this.img = img;
    		Dimension size = new Dimension(img.getWidth(null), img.getHeight(null));
    		setPreferredSize(size);
    		setMinimumSize(size);
    		setMaximumSize(size);
    		setSize(size);
    		setLayout(null);
    	}
     
    	public void paintComponent(Graphics g) {
    		g.drawImage(img, 0, 0, null);
    	}
    }

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    522
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 522
    Par défaut
    Je viens de regarder ton lien uhrand. J'ai pu me débrouiller avec les indications et ce qu'a ditadiGuba. Belle équipe. Mon code qui fonctionne :

    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
     
    package tests;
     
    import java.awt.*;
    import javax.swing.*;
     
     
    public class testRiri extends JFrame{
     
    	public testRiri() {
    		setSize(800, 500);
     
    		JPanel panTmp = new JPanel();
    		panTmp.add(new JLabel("Mon label"));
    		JButton toto = new JButton("Suite");
     
    		panTmp.add(toto);
    		panTmp.setOpaque(false);
     
    		JLabel contentPane = new JLabel();
    		contentPane.setIcon( new ImageIcon("images/fond.png"));
    		contentPane.setLayout( new BorderLayout() );
    		this.setContentPane( contentPane );
     
    		this.getContentPane().add(panTmp);
    	}
     
    	public static void main(String args[]) {
    		testRiri objScreen = new testRiri();
    		objScreen.setVisible(true);
    	}
    }
     
    class TestImagePanel extends JPanel {
     
    	private static final long serialVersionUID = 1L;
    	private Image img;
     
    	public TestImagePanel(String img) {
    		this(new ImageIcon(img).getImage());
    	}
     
    	public TestImagePanel(Image img) {
    		this.img = img;
    		Dimension size = new Dimension(img.getWidth(null), img.getHeight(null));
    		setPreferredSize(size);
    		setMinimumSize(size);
    		setMaximumSize(size);
    		setSize(size);
    		setLayout(null);
    	}
     
    	public void paintComponent(Graphics g) {
    		g.drawImage(img, 0, 0, null);
    	}
    }

  6. #6
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Ton organisation est bizarre...
    Tu as un JPanel qui contient une autre JPanel avec une image de fond (avec une taille fixe assez importante), puis d'autre composants à la suite.

    Donc tu as un grand panel qui dessine son fond, puis beaucoup plus bas tes autres composants qui sont invisible car en dehors de la fenêtre !


    Donc déjà c'est ton panel principal qui doit dessiner le fond d'écran, et non pas un panel qui contient. En clair :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    JPanel panFondEcran = new TestImagePanel(new ImageIcon("images/fond.png").getImage());

    Ensuite ton panel doit uniquement se contenter de modifier sa méthode paintComponent(). Tu n'a pas à modifier sa taille ou son layout :
    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
    class TestImagePanel extends JPanel {
     
    	private static final long serialVersionUID = 1L;
    	private Image img;
     
    	public TestImagePanel(String img) {
    		this(new ImageIcon(img).getImage());
    	}
     
    	public TestImagePanel(Image img) {
    		this.img = img;
    	}
     
    	public void paintComponent(Graphics g) {
    		g.drawImage(img, 0, 0, this);
    	}
    }

    a++

    PS : Tu peux remplacer tous les par new ImageIcon(filename).getImage() directement par Toolkit.getDefaultToolkit().getImage(filename)

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    522
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 522
    Par défaut
    Merci pour ces explications. Je comprends mieux pourquoi ça ne marchait pas avant.

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

Discussions similaires

  1. Comment ajouter un champ de type Image
    Par Francis dans le forum Bases de données
    Réponses: 4
    Dernier message: 20/02/2012, 13h41
  2. [Swing] Ajouter des images dans JLabel
    Par stragaman dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 11/04/2007, 23h07
  3. Changer apparance input de type image.
    Par licorne dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 04/08/2005, 14h11
  4. [Swing->SWT] Convertir un Icon en Image
    Par Wookai dans le forum SWT/JFace
    Réponses: 3
    Dernier message: 21/07/2005, 14h54
  5. [VB.NET] Afficher un type Image
    Par cicko dans le forum ASP.NET
    Réponses: 4
    Dernier message: 20/02/2004, 10h58

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