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 :

JFrame image de fond.


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
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 29
    Par défaut JFrame image de fond.
    Bonsoir !

    J'aimerai faire une fenêtre JFrame avec une image en fond et des JLabel/JTextArea par dessus. J'arrive à afficher l'image et par dessus mon titre mais mon JLabel "loading" ne s'affiche pas. Je ne comprend pas pourquoi le titre s'affiche correctement mais pas pour mon JLabel loading.

    J'ai longtemps cherché sur internet, j'ai vue plusieurs réponses comme setOpaque(false). J'ai essayé, sans succès.

    Voici la partie du code :
    http://pastebin.com/nH1kb4Wv

    Je suis débutant en Java donc désolé si la réponse est évidente mais je n'ai rien trouvé ... De plus si il y a des choses pas bien dans mon code dites-les moi, ça peut toujours m'aider.

    Merci !

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    en fait ton image, layoutée en PAGE_END, se dessine au dessus de ton texte "LOADING...". Rendre le composant opaque ou transparent n'y changera rien.

    Si tu veux dessiner une image en fond de ton panel, utilises plutôt cette solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    final ImageIcon image = new ImageIcon("img\\background.jpg");
    		JPanel contenuFenetre = new JPanel() {
    			protected void paintComponent(java.awt.Graphics g) {
     
    				super.paintComponent(g);
    				g.drawImage(image.getImage(), 0, 0, getWidth(), getHeight(), 0, 0, image.getIconWidth(), image.getIconHeight(),  this);
     
    			};
    		};
    et commente :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    // contenuFenetre.add(new JLabel(new ImageIcon("img\\background.jpg")),BorderLayout.PAGE_END);
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 29
    Par défaut
    Parfait, merci beaucoup de ton aide !

  4. #4
    Membre averti
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 29
    Par défaut
    Je sais que le sujet a déjà été résolu mais vue que mon problème porte sur le même sujet, je le continue.

    Je voudrais dessiner un rectangle plus tard dans ma fenêtre à partir de cette méthode mais je n'arrive pas à la rappeler avec les bons arguments. Comment faut-il faire ?

    Merci beaucoup encore vous m'aidez énormément et désolé de poser autant de questions si fréquemment ...

  5. #5
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Si j'ai bien compris ce que tu cherches à faire, voilà un exemple :

    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
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    public class TestBgFrame {
     
    	public static void main(String[] args) {
     
     
    		JFrame frame = new JFrame("INTERNET V.ALPHA");
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		class MyPanel extends JPanel  {
    			/**
                             * 
                             */
    			private static final long serialVersionUID = 1L;
     
    			final ImageIcon image = new ImageIcon(TestBgFrame.class.getResource("img/background.jpg"));
     
    			private Rectangle rectangle;
     
    			public void setRectangle(int x, int y, int width, int height) {
    				this.rectangle=new Rectangle(x,y,width,height); 
    				repaint();
    			}
     
    			public void resetRectangle() {
    				this.rectangle=null;
    				repaint();
    			}
     
    			protected void paintComponent(java.awt.Graphics g) {
     
    				super.paintComponent(g);
    				g.drawImage(image.getImage(), 0, 0, getWidth(), getHeight(), 0, 0, image.getIconWidth(), image.getIconHeight(),  this);
    				if ( rectangle!=null ) {
    					g.setColor(Color.RED);
    					g.fillRect(rectangle.x, rectangle.y, rectangle.width, rectangle.height);
    				}
     
    			};
    		};
    		final MyPanel contenuFenetre = new MyPanel();
    		contenuFenetre.setLayout(new BorderLayout());
     
    		JLabel titre = new JLabel ("INTERNET V.ALPHA",JLabel.CENTER);
    		titre.setFont(new Font("Arial",Font.BOLD,60));
    		contenuFenetre.add(titre,BorderLayout.NORTH);
     
    		JLabel loading = new JLabel ("LOADING...",JLabel.CENTER);
    		loading.setFont(new Font("Arial",Font.BOLD,90));
    		contenuFenetre.add(loading,BorderLayout.CENTER); 
     
    		JPanel buttonPanel = new JPanel();
    		buttonPanel.setLayout(new FlowLayout());
    		contenuFenetre.add(buttonPanel, BorderLayout.SOUTH);
    		buttonPanel.add(new JButton(new AbstractAction("Affiche rectangle") {
     
    			/**
                             * 
                             */
    			private static final long serialVersionUID = 1L;
     
    			public void actionPerformed(ActionEvent e) {
    				contenuFenetre.setRectangle(10,10,200,100); 
    			}
     
    		}));
    		buttonPanel.add(new JButton(new AbstractAction("Cache rectangle") {
     
    			/**
                             * 
                             */
    			private static final long serialVersionUID = 1L;
     
    			public void actionPerformed(ActionEvent e) {
    				contenuFenetre.resetRectangle(); 
    			}
     
    		}));
     
    		frame.pack();
    		frame.setContentPane(contenuFenetre);
    		frame.setSize(800,600);
    		frame.setResizable(false);
    		frame.setVisible(true);
     
    	}
     
    }
    suivant l'évolution de ton prog, il sera utile de sortir la classe MyPanel pour en faire une classe indépendante,

    si tu cherches à faire un rectangle qui dépend de la taille de ta fenêtre, on peut faire comme ça (on partant du principe qu'on ne passe plus la taille fixe du rectangle, mais une taille en pourcentage de la taille de la 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
    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
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    public class TestBgFrame {
     
    	public static void main(String[] args) {
     
     
    		JFrame frame = new JFrame("INTERNET V.ALPHA");
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		class MyPanel extends JPanel  {
    			/**
                             * 
                             */
    			private static final long serialVersionUID = 1L;
     
    			final ImageIcon image = new ImageIcon(TestBgFrame.class.getResource("img/background.jpg"));
     
    			private Rectangle rectangle;
     
    			public void setRectangle(int x, int y, int width, int height) {
    				this.rectangle=new Rectangle(x,y,width,height); 
    				repaint();
    			}
     
    			public void resetRectangle() {
    				this.rectangle=null;
    				repaint();
    			}
     
    			protected void paintComponent(java.awt.Graphics g) {
     
    				super.paintComponent(g);
    				g.drawImage(image.getImage(), 0, 0, getWidth(), getHeight(), 0, 0, image.getIconWidth(), image.getIconHeight(),  this);
    				if ( rectangle!=null ) {
    					g.setColor(Color.RED);
    					g.fillRect(evalPercent(getWidth(),rectangle.x), evalPercent(getHeight(),rectangle.y), evalPercent(getWidth(),rectangle.width), evalPercent(getHeight(),rectangle.height));
    				}
     
    			}
     
    			private int evalPercent(int size, int percent) {
    				return (int)(size*percent/100f);
    			};
    		};
    		final MyPanel contenuFenetre = new MyPanel();
    		contenuFenetre.setLayout(new BorderLayout());
     
    		JLabel titre = new JLabel ("INTERNET V.ALPHA",JLabel.CENTER);
    		titre.setFont(new Font("Arial",Font.BOLD,60));
    		contenuFenetre.add(titre,BorderLayout.NORTH);
     
    		JLabel loading = new JLabel ("LOADING...",JLabel.CENTER);
    		loading.setFont(new Font("Arial",Font.BOLD,90));
    		contenuFenetre.add(loading,BorderLayout.CENTER); 
     
    		JPanel buttonPanel = new JPanel();
    		buttonPanel.setLayout(new FlowLayout());
    		contenuFenetre.add(buttonPanel, BorderLayout.SOUTH);
    		buttonPanel.add(new JButton(new AbstractAction("Affiche rectangle") {
     
    			/**
                             * 
                             */
    			private static final long serialVersionUID = 1L;
     
    			public void actionPerformed(ActionEvent e) {
    				contenuFenetre.setRectangle(10,10,80,20); // 10 % 10 % 80 % 20 %
    			}
     
    		}));
    		buttonPanel.add(new JButton(new AbstractAction("Cache rectangle") {
     
    			/**
                             * 
                             */
    			private static final long serialVersionUID = 1L;
     
    			public void actionPerformed(ActionEvent e) {
    				contenuFenetre.resetRectangle(); 
    			}
     
    		}));
     
    		frame.pack();
    		frame.setContentPane(contenuFenetre);
    		frame.setSize(800,600);
    		frame.setResizable(false);
    		frame.setVisible(true);
     
    	}
     
    }
    etc.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  6. #6
    Membre averti
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 29
    Par défaut
    Voila, c'est ça, sauf que je voudrais qu'à un certains moment, quand le "loading" disparaît, les rectangles s'affichent dans la fenêtre. Est-ce que je suis obligé de créer buttonPanel ou je peux appeler la méthode setRectangle() plus simplement ?

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

Discussions similaires

  1. [JFrame] Image en fond de JFrame
    Par michaeljeru dans le forum Agents de placement/Fenêtres
    Réponses: 14
    Dernier message: 20/04/2007, 21h48
  2. image de fond dans une JFrame
    Par intik dans le forum Agents de placement/Fenêtres
    Réponses: 3
    Dernier message: 22/11/2006, 19h52
  3. [Swing]Image en fond de JFrame+ objets par dessus
    Par matt92700 dans le forum Agents de placement/Fenêtres
    Réponses: 6
    Dernier message: 16/01/2006, 15h12
  4. JFrame ayant pour fond une Image (centrée ou en mosaïque)
    Par mariogarcia dans le forum Agents de placement/Fenêtres
    Réponses: 12
    Dernier message: 22/12/2005, 01h01
  5. Comment mettre une image en fond de JFrame
    Par marc26 dans le forum Débuter
    Réponses: 3
    Dernier message: 19/01/2004, 17h57

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