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

Affichage des résultats du sondage: Mon code est-il propre (sans compter l'indentation)

Votants
0. Vous ne pouvez pas participer à ce sondage.
  • Oui

    0 0%
  • Moyen

    0 0%
  • Non

    0 0%
Sondage à choix multiple
AWT/Swing Java Discussion :

Swing - recharger l'image d’arrière plan d'une fenetre


Sujet :

AWT/Swing Java

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Swing - recharger l'image d’arrière plan d'une fenetre
    Bonjour,

    depuis quelques jours je suis sur un petit projet. dans cette application j'ai la possibilité d'ouvrir une fenêtre de paramétrage du logiciel en question, celui ci comporte un arrière plan (comme l’arrière plan bureau), et par le biais d'une combobox située dans la fenêtre Paramètres, lorsqu'on sélectionne un thème (arrière plan) je voudrais que celui ci se change instantanément (du moins, qu'il se change dès que l'on clique dessus son nom dans la combobox).

    Je suis encore semi-débutant en java, donc je me perds un peu avec tous les exemples que j'ai pu trouver, et rien ne convient à la méthode que j'ai du employer pour mettre un fond d'écran à ma fenêtre. D’ailleurs au passage, si quelqu'un a un moyen d'ajouter un arrière plan (avec ou sans redimensionnement automatique) de manière simple (ce qui me parait faisable avec java mais je n'ai pas trouvé pour le moment), ce serai très apprécié de me le donner avec un exemple de code.

    Je vous envoi un bout de mon code ainsi que la fenêtre du résultat pour m'assurer que vous compreniez mon problème plus aisément.




    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
     
    //CODE ARRIERE PLAN PRINCIPAL (se trouvant dans la classe principale) :
    /**
     *  ARRIERE PLAN
     */
    class PanneauImageBgPrincipal extends JComponent {
        boolean dimensionAutomatique = true;
        static Image imageFond = new ImageIcon("background/bg (36).jpg").getImage();
     
       @Override
        public void paintComponent(Graphics fond) {
            if (dimensionAutomatique)
               fond.drawImage(imageFond, 0, 0, getWidth(), getHeight(), null);
            else
               fond.drawImage(imageFond, 0, 0, imageFond.getWidth(null), imageFond.getHeight(null), null);
        }
    }
     
     
     
     
    // ET JE L’APPEL COMME CECI:
    private PanneauImageBgPrincipal panneauImage = new PanneauImageBgPrincipal();
    /….
    private void initControles() {			//--CONSTRUCTEUR
    /….
    panneauImage.setLayout(new BorderLayout());
     
    	    add(panneauImage);
    	    setVisible(true);
    }
     
     
     
     
     
    //CODE ARRIERE PLAN FENETRES (se trouvant dans la classe fenetre) :
    /**
     *  ARRIERE PLAN
     */
    @SuppressWarnings("serial")
    class PanneauImageBgPanneaux extends JComponent {
    	boolean dimensionAutomatique = true;
    	public Image imageFond = new ImageIcon("background/bg (36)5.jpg").getImage();
     
    	public void paintComponent(Graphics fond) {
    		if (dimensionAutomatique)
    			fond.drawImage(imageFond, 0, 0, getWidth(), getHeight(), null);
    		else
    			fond.drawImage(imageFond, 0, 0, imageFond.getWidth(null), imageFond.getHeight(null), null);
    	}
    }
     
     
     
     
    // ENSUITE POUR CE QUI CONCERNE MA COMBOBOX :
    private JComboBox<String> backgrounds;
    /….
    private void initControles() {			//--CONSTRUCTEUR
    /….
    		/**================== Changer arriere plan */
    		JLabel opt1 = new JLabel("Changer d'arrière plan");
    		opt1.setBounds(90, 40, 350, 30);
    		opt1.setForeground(Color.white);
    		opt1.setFont(ecritureOpt);
    		cadreOpt.add(opt1);
    		//---Ajouter une combobox
    		String [] choix = {"Bleu Design", "Lumilux", "Nature", "Beauty", "Abstrait"};
    		backgrounds = new JComboBox<String> ();
    		for (int i = 0; i<choix.length; i++) {backgrounds.addItem(choix[i]);}		//--- Boucle qui ajoute au combobox les item du tableau donné
    		backgrounds.setBounds(548, 35, 180, 35);
    		backgrounds.setBackground(null);
    		backgrounds.setFont(ecritureOpt);
    		backgrounds.setForeground(Color.black);
    		backgrounds.setOpaque(false);
    		backgrounds.addActionListener(this);
    		cadreOpt.add(backgrounds);
    }
    Merci d’avance pour votre aide.

  2. #2
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Apres modification du code pour afficher l'arriere plan
    Voici ce que j'obtient après avoir modifié mon code suivant le site que tu m'as conseillé d'aller voir Devak.
    Maintenant le souci est celui que j'ai déjà rencontré à plusieurs reprise lorsque je cherchais a intégrer un arrière plan dans une JFrame ou une JWindow : je ne peux intégrer aucun autre élément à ma fenêtre, du moins je peux mais ils ne s'affichent pas.

    vois plutôt sur la photo ci-jointe :


    voici mon code tel qu'il est actuellement :

    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
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
     
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.FlowLayout;
    import java.awt.Font;
    import java.awt.Graphics;
    import java.awt.Image;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.io.File;
    import java.io.IOException;
     
    import javax.imageio.ImageIO;
    import javax.swing.BorderFactory;
    import javax.swing.ButtonGroup;
    import javax.swing.ImageIcon;
    import javax.swing.JCheckBox;
    import javax.swing.JComboBox;
    import javax.swing.JComponent;
    import javax.swing.JDialog;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JLayeredPane;
    import javax.swing.JPanel;
    import javax.swing.JRadioButton;
    import javax.swing.JSlider;
    import javax.swing.JWindow;
    import javax.swing.UIManager;
    import javax.swing.border.Border;
    import javax.swing.event.ChangeEvent;
     
    import LIGHT_X.InterfaceFenetre.BoutonActionListener;
    import ModelBoutonTransparent.BoutonTransparent;
    import ModelBoutonTransparent.BoutonTransparentParam;
     
    public class Copy_2_of_FenetreParametres extends JFrame implements ActionListener{
     
    	private JPanel zoneOption;
    	private BoutonTransparent btnX = new BoutonTransparent("Mode Administrateur");
    	private JComboBox<String> backgrounds;
    	public ImageIcon icon = null;
     
    	public Copy_2_of_FenetreParametres() {
    		////////////////////////// TEST ////////////////////
    		try {
    			  icon = new ImageIcon(ImageIO.read(new File("background/bg (36)5.jpg")));
    			} catch (IOException e) {
    			  // pb de chargement de l'image
    			  e.printStackTrace();
    			}
    		JLabel contentPane = new JLabel(icon);
    		// ajoute le conteneur
    		this.setContentPane(contentPane);
    		// modification du layout
    		this.getContentPane().setLayout(new FlowLayout(FlowLayout.LEFT));
    		// ajout de composants
    		///////////////////////////////////////////////////
     
     
    		this.setSize(1000, 720);
    		this.setLocation(110, 250);
    		this.setVisible(true);
    		this.setResizable(false);
    		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		initcontroles();
    	}
     
    	private void initcontroles() {	
    		zoneOption = (JPanel) this.getContentPane();
    		// NE PAS OUBLIER DE METTRE TOUS LES PANNEAUX ET ELEMENT EN "opaque(false)"
    		zoneOption.setOpaque(false);
    		JPanel zoneHaut = new JPanel();
    		JPanel zoneBas = new JPanel();
     
    		//----creer un panel contenant toutes les options pour pouvoir inserer un layout null etp ouvoir placer les composant comme on veut
    		JPanel cadreOpt = new JPanel(null);
    		cadreOpt.setOpaque(false);
     
    		Font ecritureOpt2 = new Font("Arial", Font.BOLD, 18);
    		Font ecritureOpt = new Font("Arial", Font.BOLD, 25); //Tw Cen MT Condensed
     
    		/**================== Changer arriere plan */
    		JLabel opt1 = new JLabel("Changer d'arrière plan");
    		opt1.setBounds(90, 40, 350, 30);
    		opt1.setForeground(Color.white);
    		opt1.setFont(ecritureOpt);
    		cadreOpt.add(opt1);
    		//---Ajouter une combobox
    		String [] choix = {"Bleu Design", "Lumilux", "Nature", "Beauty", "Abstrait"};
    		backgrounds = new JComboBox<String> ();
    		for (int i = 0; i<choix.length; i++) {backgrounds.addItem(choix[i]);}		//--- Boucle qui ajoute au combobox les item du tableau donné
    		backgrounds.setBounds(548, 42, 180, 30);
    		backgrounds.setBackground(null);
    		backgrounds.setFont(ecritureOpt2);
    		backgrounds.setForeground(Color.black);
    		backgrounds.setOpaque(false);
    		backgrounds.addActionListener(this);
    		cadreOpt.add(backgrounds);
     
    		/**================== Desactiver voix */
    		JLabel opt2 = new JLabel("Activer les voix");
    		opt2.setBounds(90, 90, 350, 30);
    		opt2.setForeground(Color.white);
    		opt2.setFont(ecritureOpt);
    		cadreOpt.add(opt2);
    		//---Ajouter une checkbox "[] activer)
    		JCheckBox chkActive = new JCheckBox("Activer");						//--- Cree un CheckBox
    		chkActive.setSelected(true);											//--- Coche la case
    		chkActive.setBounds(544, 93, 350, 30);
    		chkActive.setBackground(Color.white);
    		chkActive.setFont(ecritureOpt2);
    		chkActive.setForeground(Color.black);
    		chkActive.setOpaque(false);
    		cadreOpt.add(chkActive);
     
    		/**================== Changer voix */
    		JLabel opt3 = new JLabel("Choix de la voix");
    		opt3.setBounds(90, 140, 350, 30);
    		opt3.setForeground(Color.white);
    		opt3.setFont(ecritureOpt);
    		cadreOpt.add(opt3);
    		//---Ajouter une radiobutton (femme, homme)
    		JPanel optionVoix = new JPanel();
    		JRadioButton optH = new JRadioButton("Homme");
    		JRadioButton optF = new JRadioButton("Femme");
    		optF.setSelected(true);
    		optH.setOpaque(false);
    		optF.setOpaque(false);
    		optH.setFont(ecritureOpt2);
    		optF.setFont(ecritureOpt2);
     
    		ButtonGroup grpOption = new ButtonGroup();
    		grpOption.add (optH);
    		grpOption.add (optF);
    		optionVoix.add (optH);
    		optionVoix.add (optF);
    		optionVoix.setBounds(490, 140, 300, 30);
    		optionVoix.setOpaque(false);
    		cadreOpt.add(optionVoix);
     
     
    		/**================== TITRE */
    		JLabel optTitre = new JLabel("Paramètrage");
    		optTitre.setOpaque(false);
     
    		zoneBas.setOpaque(false);
    		zoneBas.setLayout(null);
    		//////////////////////////////////////////////
    		optTitre.setFont(new Font("Arial", Font.ITALIC+Font.BOLD, 54));
    		optTitre.setForeground(Color.white);
    		//optTitre.setForeground(new Color(0, 255, 0, 96));
     
    		zoneHaut.setOpaque(false);				///// Ajout du label  au panneau nord
    		zoneHaut.add(optTitre);
     
    		/**================== BOUTON ADMIN */
    		btnX.setOpaque(false);
    		btnX.setFocusPainted(false);
    		btnX.setForeground(Color.YELLOW);
    		btnX.setBounds(40, 560, 200, 30);
    		btnX.setFont(new Font("Arial", Font.BOLD, 15));
    		btnX.addActionListener(this);
     
    		zoneBas.setOpaque(false);
    		cadreOpt.add(btnX);
     
    		zoneOption.add(zoneHaut, BorderLayout.NORTH);
    		zoneOption.add(cadreOpt, BorderLayout.CENTER);
    		zoneOption.add(zoneBas, BorderLayout.SOUTH);
    		zoneOption.setVisible(true);
     
    		getContentPane().add(zoneOption);
     
    		//setVisible(true);
     
    	}
     
     
     
    	/**
             * 
             * ACTIONS LISTENER
             * 
             */
    	public void actionPerformed(ActionEvent e)	{
    		if (e.getSource() == backgrounds) backgrounds_click();	//-- si on clique sur le panneau combobox pour choisir l'arriere plan
    		if (e.getSource() == btnX) btn_admin_click();
    	}
     
     
    	private void btn_admin_click() {
     
    	}
     
    	private void backgrounds_click() {
    		//--deja on va chercher a savoir sur kel arriere plan on a cliké
    		if (backgrounds.getSelectedItem().toString() == "Bleu Design") Bleu_Design_click();//--si tu click sur le bleu alors tu change l'arriere plan de l'interface et l'arriere plan des petites fenetres
    		if (backgrounds.getSelectedItem().toString() == "Lumilux") Lumilux_click();
    //		if (backgrounds.getSelectedItem().toString() == "Nature") Nature();
    //		if (backgrounds.getSelectedItem().toString() == "Beauty") Beauty();
    //		if (backgrounds.getSelectedItem().toString() == "Abstrait") Abstrait();
    	}
     
    	//--ensuite on va affecter une action differente pour chaque arriere plan
    	/**========== CHANGER D'ARRIERE PLAN BLEU */
    	private void Bleu_Design_click() {
     
    	}
    	/**========== CHANGER D'ARRIERE PLAN BLEU */
    	private void Lumilux_click() {
     
    	}
     
    	/**
             * @param args
             */
    	public static void main(String[] args) {
    		Copy_2_of_FenetreParametres fen = new Copy_2_of_FenetreParametres();
    		fen.setVisible(true);
    	}
    }

  3. #3
    Membre actif Avatar de Vikisme
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2007
    Messages
    172
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2007
    Messages : 172
    Points : 228
    Points
    228
    Par défaut
    Bonjour,

    Déjà, pour répondre à la question "Ce code est-il propre ?" :

    Après, pour le fond :
    • Si ta question est "est-ce que c'est bien de redessiner l'image de fond en surchargeant la méthode paintComponent ?", la réponse est oui. Après, personnellement, j'aurais plutôt garder un attribut BufferedImage que de le transformer en une ImageIcon. Mais bon, l'image est gérée avec un tampon ce qui "optimise" le traitement et c'est ce qui compte.
    • Après, pour ce qui est du code swing, c'est une question de point de vue. J'avoue avoir une préférence pour une certaine organisation plutôt que le "tout le code dans la même méthode", mais avec les générateurs de code, on ne choisi pas forcément et si c'est pour tout refaire derrière il n'y a pas grand intérêt.
    • Autre point, je ne vois pas l'intérêt d'avoir 2 composants identiques ? Pourquoi avoir 2 PanneauBgImageXXX ? Parce que l'image est différente ? Il vaut mieux en avoir un seul avec comme attribut l'image utilisée !
    • Pour la ComboBox, on préférera très largement utiliser un modèle plutôt que faire une boucle pour ajouter les éléments, quitte à faire quelque chose comme ça :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      backgrounds.setModel(new DefaultComboBoxModel(choix));
    • Ensuite, concernant le traitement, plutôt que de multiplier les méthodes en fonction des couleurs, j'aurais plutôt définit un attribut pour la couleur de fond, utilisé par le panneau qui le dessine, en réalisant la même chose indépendamment du choix et du nombre de choix surtout. S'il y a une image ou d'autres attributs associés à une couleur de fond, j'aurais plutôt créer un objet à proprement dit dans lequel il y aurait tout, et la ComboBox aurait comme modèle une liste de cet objet pour pouvoir assurer un traitement simple et clair derrière. (Je sais pas si je suis clair )

    Par rapport au second post, je ne sais pas ce qui a été dit, mais quoi qu'il en soit il est plus propre de redéfinir la méthode paint d'un panel plutôt que d'ajouter un JLabel pour faire office de fond (=> pas beau, pas lisible et surtout il n'y a aucune réelle maîtrise du résultat). Accessoirement, un JLabel, c'est du texte, avec éventuellement une image avec, dans un coin ou sur un côté. Il faut l'utiliser comme tel et pas forcément le détourner. Ici tu l'ajoute en tant que composant principal de ta fenêtre. Sauf que le JLabel ne se comporte pas comme un conteneur donc tout ce que tu cherche à ajouter dedans par la suite, ça ne fonctionne pas.
    Tout passe, tout casse
    Le joint le cul lassent...


    http://www.myspace.fr/geampa_raler

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Ahh, voila une réponse très utile
    Tout d'abord je te remercie vraiment Vikisme d'avoir prêter attention à mon problème, et te félicite pour ces explications très claires, toutes les informations que tu m'as donné m'ont aidé à comprendre un peu plus la chose.

    Ceci dit, avant tout, je voudrais préciser une chose dont tu as parlé dans ta réponse mais pour laquelle je pense que tu n'avais pas compris ma démarche explicative : je m'explique, concernant l'affichage de mon code dans le post, en fait j'ai bel et bien plusieurs classes (ce n'est pas du tout en un ) sauf que ici j'ai juste fais des petits paquet pour ne pas avoir a recopier toutes les classes. Ensuite, petite précision, je n'ai utilisé aucun générateur de code (si c'est de ça dont tu voulais parler lorsque tu as cité ce mot) je début simplement dans le codage Java tout en ayant pas mal de petites bases par ci par la.
    Autre chose, en fait je veux pas changer la couleur de mon arrière plan mais tout simplement changer l'image d’arrière plan par une autre, les couleur en fait ne correspondent qu'au nom que je leur ai donné.

    Concernant le fait du JLabel, d'accord, ceci explique cela, en fait quelqu'un du chat m'a envoyé un lien ou se trouvait un code pour une autre méthode pour balancer une image en fond d’écran, je la trouvais beaucoup plus simple que celle que j'utilisais et surtout elle avait l'air plus fonctionnelle donc je l'ai utilisée pour mon code en remplaçant mon ancien code de la méthode paint.

    Par contre je n'ai pas très bien saisie l’histoire du combobox, car ce que j'ai fais est tout simplement une liste déroulante qui propose des arrière plan, et lorsque l'on clique dessus un de ces éléments, je veux faire en sorte que ça charge l'image en question en arrière plan a la place de celui actuel.

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Oublié de revenir sur ce sujet
    Pour ceux ou celle que ça intéressent, mon souci venait du fait que les layout se mélangeaient, mon background était en Flowlayout et je voulais mettre le panel en layout null. A priori ça posait souci, les deux se feraient la guerre...

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

Discussions similaires

  1. image arriere plan d'une figure
    Par sifouasma dans le forum MATLAB
    Réponses: 1
    Dernier message: 22/04/2014, 14h26
  2. [C#][Mobile]Image arriere plan d'une form
    Par HeB91 dans le forum C#
    Réponses: 5
    Dernier message: 28/11/2009, 03h17
  3. image comme arrière-plan dans une fenetre?
    Par afrikha dans le forum GTK+ avec C & C++
    Réponses: 6
    Dernier message: 08/10/2005, 20h22
  4. Réponses: 4
    Dernier message: 03/05/2005, 09h03

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