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 :

Background pour un JPanel et "actualisation" d'une fenetre


Sujet :

Java

  1. #1
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2017
    Messages : 87
    Points : 49
    Points
    49
    Par défaut Background pour un JPanel et "actualisation" d'une fenetre
    Bonjour,
    Pour un projet je dois créer une application qui navigue entre plusieurs pages suivant les boutons sur lesquels on clique. J'ai créé une class Fenetre extends JFrame pour la fenetre principale et j'ai défini d'autres classes extends JPanel pour chaque pages différentes. J'ai deux problèmes: pour les classes extends JPanel je n'arrive pas à mettre un fond d'écran sur la totalité de la fenêtre sans que cela repasse par dessus les boutons, et je n'arrive pas à faire en sorte que lorsque l'on clique sur un bouton, par exemple Paramètres, on arrive sur la classe Paramètres. J'ai fait une classe héritant de ActionListener et dans la méthode ActionPerformed j'appelle une classe update dans ma classe Fenetre pour qu'une nouvelle instance de Paramètres soit créé et s'affiche. Je sais pas trop si c'est clair ^^

    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Montres-nous ton code, ce sera plus clair.

    De quoi tu parles par fond d'écran dans une fenêtre ? Comment c'est fait ?

    Sinon, globalement, pour faire ce que tu cherches à faire (afficher plusieurs "pages" différentes dans une fenêtre en fonction de différents boutons (ou menus)), utilise un cardlayout.

    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
    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
    import java.awt.BorderLayout;
    import java.awt.CardLayout;
    import java.awt.Color;
    import java.awt.FlowLayout;
    import java.awt.GridBagConstraints;
    import java.awt.GridBagLayout;
    import java.awt.Image;
    import java.awt.Insets;
    import java.io.File;
    import java.io.IOException;
     
    import javax.activation.MimetypesFileTypeMap;
    import javax.imageio.ImageIO;
    import javax.swing.BorderFactory;
    import javax.swing.ImageIcon;
    import javax.swing.JButton;
    import javax.swing.JFileChooser;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JOptionPane;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTextField;
    import javax.swing.filechooser.FileFilter;
     
    public class DemoCardLayout extends JFrame {
     
    	public DemoCardLayout() {
     
    		CardLayout cardLayout = new CardLayout();
     
    		JPanel panel = new JPanel(cardLayout);
     
    		JLabel titleLabel = new JLabel("Affichage de page truc.");
    		titleLabel.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5),BorderFactory.createLineBorder(Color.RED, 1, true)));
     
    		JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT, 5, 5));
    		addPage(buttonPanel, titleLabel, panel, cardLayout, new PageTruc(), "TRUC", "Page truc");
    		addPage(buttonPanel, titleLabel, panel, cardLayout, new PageMachin(), "MACHIN", "Page machin");
    		addPage(buttonPanel, titleLabel, panel, cardLayout, new PageBidule(), "BIDULE", "Page bidule");
     
    		add(titleLabel, BorderLayout.NORTH);
    		add(panel);
    		add(buttonPanel, BorderLayout.SOUTH);
    		setSize(400,400);
    		setLocationRelativeTo(null);
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	}
     
    	private void addPage(JPanel buttonPanel, JLabel titlelabel, JPanel panel, CardLayout cardLayout, JPanel page, String pageId, String actionName) {
    		panel.add(page, pageId);
    		JButton button = new JButton(actionName);
    		buttonPanel.add(button);
    		button.addActionListener(e-> {
    			cardLayout.show(panel, pageId);
    			titlelabel.setText("Affichage de "+actionName.toLowerCase()+".");
    		});
    	}
     
    	public static void main(String[] args) {
    		new DemoCardLayout().setVisible(true);
    	}
     
    	public static class PageTruc extends JPanel {
     
    		private final JTextField[] fields = new JTextField[3];
    		public PageTruc() {
    			super(new BorderLayout());
    			JPanel content = new JPanel(new GridBagLayout());
    			for(int i=0; i<fields.length; i++) {
    				JLabel label = new JLabel("Champ "+(i+1)+" :");
    				content.add(label, new GridBagConstraints(0, i, 1, 1, 0, 0, GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(1,1,1,1), 0, 0));
    				fields[i]=new JTextField();
    				label.setLabelFor(fields[i]);
    				content.add(fields[i], new GridBagConstraints(1, i, 1, 1, 1, 0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(1,1,1,1), 0, 0));
    			}
    			add(content,BorderLayout.NORTH);
    		}
     
    	}
     
    	public static class PageMachin extends JPanel {
     
    		private JTextField textField;
    		private JButton button;
     
    		public PageMachin() {
    			super(new FlowLayout(FlowLayout.CENTER));
    			textField = new JTextField(10);
    			add(textField);
    			button = new JButton("Action");
    			add(button);
    		}
     
    	}
     
    	public static class PageBidule extends JPanel {
     
    		private File lastDir;
     
    		public PageBidule() {
    			super(new BorderLayout());
    			JLabel label = new JLabel();
    			add(new JScrollPane(label));
    			JButton button = new JButton("Changer image");
    			JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
    			buttonPanel.add(button);
    			add(buttonPanel, BorderLayout.NORTH);
    			button.addActionListener(e-> changeImage(label));
    		}
     
    		private void changeImage(JLabel label) {
    			JFileChooser chooser = new JFileChooser(lastDir);
    			chooser.setDialogTitle("Choisir un fichier image");
    			chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
    			chooser.setFileFilter(new FileFilter() {
     
    				@Override
    				public String getDescription() {
    					return "Fichiers image";
    				}
     
    				@Override
    				public boolean accept(File f) {
    					return f.isDirectory() || MimetypesFileTypeMap.getDefaultFileTypeMap().getContentType(f.getName()).startsWith("image/");
    				}
     
    			});
    			if ( chooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION ) {
    				try {
    					Image image = ImageIO.read(chooser.getSelectedFile());
    					label.setIcon(new ImageIcon(image));
    					lastDir = chooser.getSelectedFile().getParentFile();
    				} catch (IOException e) {
    					JOptionPane.showMessageDialog(this, "Impossible de charger le fichier "+ chooser.getSelectedFile().getName(), "Erreur", JOptionPane.ERROR_MESSAGE); 
    				}
    			}
     		}
     
    	}
     
    }


    Il y a également le JTabbedPane qui est particulièrement adapté pour ce type d'interface, et c'est nettement plus simple.


    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
    import java.awt.BorderLayout;
    import java.awt.FlowLayout;
    import java.awt.GridBagConstraints;
    import java.awt.GridBagLayout;
    import java.awt.Image;
    import java.awt.Insets;
    import java.io.File;
    import java.io.IOException;
     
    import javax.activation.MimetypesFileTypeMap;
    import javax.imageio.ImageIO;
    import javax.swing.ImageIcon;
    import javax.swing.JButton;
    import javax.swing.JFileChooser;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JOptionPane;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTabbedPane;
    import javax.swing.JTextField;
    import javax.swing.filechooser.FileFilter;
     
    public class DemoCardLayout extends JFrame {
     
    	public DemoCardLayout() {
     
    		JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.BOTTOM);
     
    		addPage(tabbedPane, new PageTruc(), "Page truc");
    		addPage(tabbedPane, new PageMachin(), "Page machin");
    		addPage(tabbedPane, new PageBidule(), "Page bidule");
     
    		add(tabbedPane);
    		setSize(400,400);
    		setLocationRelativeTo(null);
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	}
     
    	private void addPage(JTabbedPane tabbedPane, JPanel page, String title) {
    		tabbedPane.addTab(title, page);
    	}
     
    	public static void main(String[] args) {
    		new DemoCardLayout().setVisible(true);
    	}
     
    	public static class PageTruc extends JPanel {
     
    		private final JTextField[] fields = new JTextField[3];
    		public PageTruc() {
    			super(new BorderLayout());
    			JPanel content = new JPanel(new GridBagLayout());
    			for(int i=0; i<fields.length; i++) {
    				JLabel label = new JLabel("Champ "+(i+1)+" :");
    				content.add(label, new GridBagConstraints(0, i, 1, 1, 0, 0, GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(1,1,1,1), 0, 0));
    				fields[i]=new JTextField();
    				label.setLabelFor(fields[i]);
    				content.add(fields[i], new GridBagConstraints(1, i, 1, 1, 1, 0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(1,1,1,1), 0, 0));
    			}
    			add(content,BorderLayout.NORTH);
    		}
     
    	}
     
    	public static class PageMachin extends JPanel {
     
    		private JTextField textField;
    		private JButton button;
     
    		public PageMachin() {
    			super(new FlowLayout(FlowLayout.CENTER));
    			textField = new JTextField(10);
    			add(textField);
    			button = new JButton("Action");
    			add(button);
    		}
     
    	}
     
    	public static class PageBidule extends JPanel {
     
    		private File lastDir;
     
    		public PageBidule() {
    			super(new BorderLayout());
    			JLabel label = new JLabel();
    			add(new JScrollPane(label));
    			JButton button = new JButton("Changer image");
    			JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
    			buttonPanel.add(button);
    			add(buttonPanel, BorderLayout.NORTH);
    			button.addActionListener(e-> changeImage(label));
    		}
     
    		private void changeImage(JLabel label) {
    			JFileChooser chooser = new JFileChooser(lastDir);
    			chooser.setDialogTitle("Choisir un fichier image");
    			chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
    			chooser.setFileFilter(new FileFilter() {
     
    				@Override
    				public String getDescription() {
    					return "Fichiers image";
    				}
     
    				@Override
    				public boolean accept(File f) {
    					return f.isDirectory() || MimetypesFileTypeMap.getDefaultFileTypeMap().getContentType(f.getName()).startsWith("image/");
    				}
     
    			});
    			if ( chooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION ) {
    				try {
    					Image image = ImageIO.read(chooser.getSelectedFile());
    					label.setIcon(new ImageIcon(image));
    					lastDir = chooser.getSelectedFile().getParentFile();
    				} catch (IOException e) {
    					JOptionPane.showMessageDialog(this, "Impossible de charger le fichier "+ chooser.getSelectedFile().getName(), "Erreur", JOptionPane.ERROR_MESSAGE); 
    				}
    			}
     		}
     
    	}
     
    }
    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 du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2017
    Messages : 87
    Points : 49
    Points
    49
    Par défaut
    J'ai réussi à faire mon cardLayout, le changement avec les boutons marche bien mais la mise en page est différente de celle lorsque j'affiche un JPanel sans utilisation du card Layout.
    Voici mon code pour la classe principale ou j'utilise mon cardLayout:
    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
     
    public class Fenetre extends JFrame{//Faire tout les panels puis les appeler lorsque qu'on appuie sur le bouton plutot qu'un cardLayout
    	private Controller controller;
    	private Taches taches;
    	private Accueil accueil;
    	private PenseBete penseBete;
    	private JButton tache;
    	private CardLayout cardLayout;
    	private MyActionListener myActionListener;
    	private JPanel main;
    	public Fenetre(String nom, Accueil accueil, Taches taches, PenseBete penseBete){
    		super(nom);
    		this.accueil = accueil;
    		this.taches = taches;
    		this.controller = controller;
    		this.myActionListener = new MyActionListener(accueil,taches,this);
    		this.controller = new Controller(accueil, taches,myActionListener);
    		setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 
    		this.cardLayout = new CardLayout();
     
    		JPanel fenetre = new JPanel(new BorderLayout());
     
    		JPanel panAcc = new JPanel();
    		panAcc.add(accueil); 
     
    		JPanel panTaches = new JPanel();
    		panTaches.add(taches);
     
    		JPanel panPenseBete = new JPanel();
    		panPenseBete.add(penseBete);
     
    		main = new JPanel (cardLayout);
    		fenetre.add(main);
            main.add("accueil", panAcc);
     
            panTaches.setName("taches");
            main.add("taches",panTaches);
     
            panPenseBete.setName("penseBete");
            main.add("penseBete",panPenseBete);
     
     
     
    		this.setLayout(new java.awt.BorderLayout()); 	
    		this.add(fenetre);
    		this.setSize(850,480);
    		this.setResizable(false);
    		this.setVisible(true);
    		System.out.println("constructeur fenetre");
    	}
     
    	public void changePanelTaches(){
    		System.out.println("methode changePanel");
    		((CardLayout)main.getLayout()).show(this.main,"taches");
    		this.setVisible(true);
    	}
     
    	public void changePanelPenseBete(){
    		((CardLayout)main.getLayout()).show(this.main,"penseBete");
    	}
     
    }

  4. #4
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2017
    Messages : 87
    Points : 49
    Points
    49
    Par défaut
    Avec la cardLayout l'affichage est :
    Nom : 1.1.png
Affichages : 609
Taille : 9,9 Ko

    Et sans le cardLayout:
    Nom : 1.2.png
Affichages : 582
Taille : 10,7 Ko

  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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Ce n'est pas évident de savoir ce qu'il se passe vu que je n'ai pas le code de Taches, Accueil ou PenseBete. Mais je pense que ça vient des layouts intermédiaires des JPanel mis dans le cardlayout.

    Tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    JPanel panAcc = new JPanel();
    panAcc.add(accueil);
    Le layout par défaut d'un panel est une FlowLayout, et suivant le layout dans Accueil, ça peut donner des résulats comme ce que tu montres.

    Essaye d'ailleurs de ne pas faire de panel intermédiaire : tu peux mettre directement l'instance de accueil dans le container avec cardLayout (main).
    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 du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2017
    Messages : 87
    Points : 49
    Points
    49
    Par défaut
    D'accord je ne savais pas, ça marche merci beaucoup. Est-ce que vous auriez une idée pour mettre mon background à mes JPanel? J'ai essayé avec setIcon mais je ne comprends pas très bien comment faire. Voici le code de ma classe Accueil:

    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
     
    public class Accueil extends JPanel{//Mettre le fond d'ecran
    	private JButton tache;
    	private JButton penseBete;
    	private JButton calendrier;
    	private JButton quitter;
    	private JButton parametres;
    	private JButton aide;
    	public Accueil(){
    		System.out.println("constructeur accueil");
    		//JPanel accueil = new JPanel();
    		JPanel gauche = new JPanel();
    		JLabel content = new JLabel();
    		JPanel east = new JPanel();
     
    		east.setLayout(new java.awt.BorderLayout());
    		gauche.setLayout(new java.awt.GridLayout(3,1));
    		this.setLayout(new java.awt.BorderLayout());
    		content.setLayout(new BorderLayout());
    		content.setIcon(new ImageIcon("fond.png"));//image de fond d'ecran
    		content.setLayout(new BorderLayout());
    		content.setVisible(true);
    		//Fais en sorte que l'on voit l'image derrière
        	gauche.setOpaque(false);// important, les jpanel sont en opaque=1 par defaut
        	east.setOpaque(false);
        	//Ajout des boutons
        	aide = new JButton("Aide");
        	parametres = new JButton("Parametres");
        	quitter = new JButton("Quitter");
        	gauche.add(quitter);
        	gauche.add(parametres);
        	gauche.add(aide);
        	east.add(gauche,BorderLayout.NORTH);
     
        	//Partie du milieu
        	tache = new JButton("Taches");
        	penseBete = new JButton("Pense Bete");
        	calendrier = new JButton("Calendrier");
     
     
        	JPanel centre = new JPanel();
        	centre.setLayout(new GridBagLayout());
        	GridBagConstraints gc1 = new GridBagConstraints();
        	gc1.fill = GridBagConstraints.BOTH;
    		gc1.ipady = gc1.anchor = GridBagConstraints.CENTER;
    		gc1.weightx = 20;
    		gc1.weighty = 1;
    		gc1.insets = new Insets(50,100,0,-150);//Gauche/Bas/Haut/Droite
     
    		GridBagConstraints gc2 = new GridBagConstraints();
        	gc2.fill = GridBagConstraints.BOTH;
    		gc2.ipady = gc2.anchor = GridBagConstraints.CENTER;
    		gc2.weightx = 20;
    		gc2.weighty = 1;
    		gc2.insets = new Insets(50,0,0,50);//Haut/Gauche/Bas/Droite
     
    		GridBagConstraints gc3 = new GridBagConstraints();
        	gc3.fill = GridBagConstraints.BOTH;
    		gc3.ipady = gc3.anchor = GridBagConstraints.CENTER;
    		gc3.weightx = 20;
    		gc3.weighty = 1;
    		gc3.insets = new Insets(50,10,50,-150);//Gauche/Haut/Bas/Droite
     
    		gc1.gridx = 0;
    		gc1.gridy = 0;
    		centre.add(tache,gc1);
    		gc2.gridx = 2;
    		gc2.gridy = 0;
    		centre.add(penseBete,gc2);
    		gc3.gridx = 1;
    		gc3.gridy = 1;
    		centre.add(calendrier,gc3);
     
    		centre.setOpaque(false);
    		this.add(content);
    		this.add(east,BorderLayout.EAST);
        	this.add(centre,BorderLayout.CENTER);
     
    		this.setSize(850,480);
    		this.setVisible(true);
     
    	}
    }

  7. #7
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Déjà, tu fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    this.add(content);
    this.add(east,BorderLayout.EAST);
    this.add(centre,BorderLayout.CENTER);
    Comme le layout de ton panel Accueil est un BorderLayout, this.add(content); c'est équivalent à this.add(content, BorderLayout.CENTER);. Tu mets donc 2 composants layoutés au centre et un BorderLayout ne peut en gérer qu'un seul : ça va donc faire n'importe quoi (content ne sera pas correctement layouté).
    La problématique de gérer l'image par un composant (comme un JLabel), c'est donc de pouvoir mettre 2 composants l'un au-dessus de l'autre. Pour ça on peut utiliser un OverlayLayout. Une autre solution est de dessiner directement l'image dans le fond. Cela pose d'autres problèmes (dû à l'opacité des différents composants qu'on met par dessus).

    Cette problématique est abordée dans ce message avec renvoi à cette discussion (avec source en exemple): https://www.developpez.net/forums/d1...terface-swing/
    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.

  8. #8
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2017
    Messages : 87
    Points : 49
    Points
    49
    Par défaut
    J'ai essayé avec l'OverLayLayout que tu donnes dans ton exemple mais rien ne s'affiche, ni les composants ni l'image de 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
    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
     
    JPanel gauche = new JPanel();
    		JPanel east = new JPanel();
     
    		east.setLayout(new java.awt.BorderLayout());
    		gauche.setLayout(new java.awt.GridLayout(3,1));
    		this.setLayout(new java.awt.BorderLayout());
     
    		JLabel label = new JLabel(new ImageIcon("fond.png"));
    		JPanel panel = new JPanel();
    		panel.setLayout(new OverlayLayout(panel));
     
    		//Fais en sorte que l'on voit l'image derrière
        	gauche.setOpaque(false);// important, les jpanel sont en opaque=1 par defaut
        	east.setOpaque(false);
        	//Ajout des boutons
        	aide = new JButton("Aide");
        	parametres = new JButton("Parametres");
        	quitter = new JButton("Quitter");
        	gauche.add(quitter);
        	gauche.add(parametres);
        	gauche.add(aide);
        	east.add(gauche,BorderLayout.NORTH);
     
        	//Partie du milieu
        	tache = new JButton("Taches");
        	penseBete = new JButton("Pense Bete");
        	calendrier = new JButton("Calendrier");
     
     
        	JPanel centre = new JPanel();
        	centre.setLayout(new GridBagLayout());
        	GridBagConstraints gc1 = new GridBagConstraints();
        	gc1.fill = GridBagConstraints.BOTH;
    		gc1.ipady = gc1.anchor = GridBagConstraints.CENTER;
    		gc1.weightx = 20;
    		gc1.weighty = 1;
    		gc1.insets = new Insets(50,100,0,-150);//Gauche/Bas/Haut/Droite
     
    		GridBagConstraints gc2 = new GridBagConstraints();
        	gc2.fill = GridBagConstraints.BOTH;
    		gc2.ipady = gc2.anchor = GridBagConstraints.CENTER;
    		gc2.weightx = 20;
    		gc2.weighty = 1;
    		gc2.insets = new Insets(50,0,0,50);//Haut/Gauche/Bas/Droite
     
    		GridBagConstraints gc3 = new GridBagConstraints();
        	gc3.fill = GridBagConstraints.BOTH;
    		gc3.ipady = gc3.anchor = GridBagConstraints.CENTER;
    		gc3.weightx = 20;
    		gc3.weighty = 1;
    		gc3.insets = new Insets(50,10,50,-150);//Gauche/Haut/Bas/Droite
     
    		gc1.gridx = 0;
    		gc1.gridy = 0;
    		centre.add(tache,gc1);
    		gc2.gridx = 2;
    		gc2.gridy = 0;
    		centre.add(penseBete,gc2);
    		gc3.gridx = 1;
    		gc3.gridy = 1;
    		centre.add(calendrier,gc3);
     
    		centre.setOpaque(false);
     
    		this.add(east,BorderLayout.EAST);
        	this.add(centre,BorderLayout.CENTER);
        	this.add(label);
        	panel.setOpaque(false);
        	this.add(panel);
     
    		this.setSize(850,480);
    		this.setVisible(true);

  9. #9
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Tu continues à mettre plusieurs composants au centre (3 maintenant) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    		    	this.add(centre,BorderLayout.CENTER); // 1
    		    	this.add(label); // 2
    		    	panel.setOpaque(false);
    		    	this.add(panel); // 3
    Fais plutôt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    		    	panel.add(label); // le label est le composant avec l'image, donc le fond : on l'ajoute en premeir
    		    	panel.add(centre); // on met le centre au dessus du label
    		    	centre.setOpaque(false); // on rend transparent le centre, sinon il cachera le label
    		    	this.add(panel,BorderLayout.CENTER); // le panel est le composant de combinaison (avec OverlayLayout) : on le met au centre du contentpane
    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.

  10. #10
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2017
    Messages : 87
    Points : 49
    Points
    49
    Par défaut
    D'accord merci ça marche. Y a-t-il un moyen pour dire ou l'on veux placer les composants dans l'overLayLayout comme dans le BorderLayout par exemple? Car tout ce met au milieu

    Nom : 1.3.png
Affichages : 631
Taille : 18,2 Ko

  11. #11
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Non, un OverlayLayout ne permet que de mettre des composants les uns au dessus des autres. Mais l'un de ces composants peut avoir lui même un autre layout qui permet plusieurs composants. Attention toutefois : on ne contrôle pas l'ordre de redessin des panels dans un OverlayLayout. L'opacité peut être problématique, et il faudra éventuellement prévoir de redessiner le conteneur pour forcer l'affichage de tout. En plus, lors du redimensionnement de fenêtre, on peut avoir le fond qui reste un moment par dessus le reste. Personnellement, je préfère l'autre solution pour dessiner dans le fond du panel.

    Exemple avec l'OverlayLayout :

    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
    public class DemoLayout {
     
    	public static void main(String[] args) {
     
    		JFrame frame = new JFrame("Démo");
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		JPanel mainPanel = new JPanel();
    		mainPanel.setLayout(new OverlayLayout(mainPanel));
     
    		mainPanel.add(createBackgroundPanel());
    		mainPanel.add(createPanel());
     
    		frame.add(mainPanel);
     
    		frame.setSize(500, 500);
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
     
    	}
     
    	private static Component createBackgroundPanel() {
    		JPanel panel = new JPanel(new GridBagLayout());
    		try {
    			panel.add(new JLabel(new ImageIcon(new URL("https://gabarit.developpez.be/images/logo.png"))));
    		} catch (MalformedURLException e) {
    			e.printStackTrace();
    		}
    		panel.setOpaque(false);
    		return panel;
    	}
     
     
    	private static Component createPanel() {
    		JPanel panel = new JPanel(new BorderLayout());
    		panel.setOpaque(false);
    		JPanel form = new JPanel(new GridBagLayout());
    		GridBagConstraints gbc = new GridBagConstraints(0,0,1,1,0,0,GridBagConstraints.CENTER,GridBagConstraints.NONE,new Insets(20,0,20,0),0,0);
    		for(int i=0; i<4; i++) {
    			gbc.gridy=i;
    			gbc.gridx=0;
    			gbc.fill=GridBagConstraints.NONE;
    			gbc.weightx=0;
    			form.add(new JLabel("Champ "+(i+1)+" :"),gbc);
    			gbc.gridx=1;
    			gbc.fill=GridBagConstraints.HORIZONTAL;
    			gbc.weightx=1;
    			form.add(new JTextField(),gbc);
    		}
    		form.setOpaque(false);
    		panel.add(form);
    		Box buttonPanel = new Box(BoxLayout.Y_AXIS);
    		for(int i=0; i<3; i++) {
    			buttonPanel.add(new JButton("Button "+(i+1)));
    		}
    		buttonPanel.setOpaque(false);
    		panel.add(buttonPanel, BorderLayout.EAST);
    		return panel;
    	}
     
    }
    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.

  12. #12
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2017
    Messages : 87
    Points : 49
    Points
    49
    Par défaut
    Ca marche merci beaucoup, c'est juse dommage qu'on doive passer la souris pour que les composants s'affichent mais j'ai l'impression que c'est le seul moyen pour que je puisse mettre un fond d'écran. Merci beaucoup pour votre aide. Sujet résolu

  13. #13
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Ça c'est le problème dont je te parlais, qui est dû au problème d'ordre de repaint. Il faut que tous les panels soit transparents et qu'aucun composant ne se chevauchent. Eventuellement, il faut faire explicitement des repaints pour contrôller l'ordre, en particulier si on veut autoriser le redimensionnement.
    L'autre solution, qui évite ces problèmes, c'est d'utiliser l'autre solution (!)
    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.

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

Discussions similaires

  1. REQ : Algo pour vérification saisie du "Numero TVA"
    Par Eric.H dans le forum Langage
    Réponses: 4
    Dernier message: 28/01/2009, 10h23
  2. [débutant] image de background pour un JPanel
    Par thiouwz dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 06/11/2006, 15h49

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