Précédent   Forum du club des développeurs et IT Pro > Java > Interfaces Graphiques en Java > AWT/SWING
AWT/SWING
Forum d'entraide pour les API Swing et AWT. Avant de poster -> FAQ AWT/SWING
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 26/12/2012, 21h55   #1
thierryler
Rédacteur
 
Avatar de thierryler
 
Homme Thierry Leriche-Dessirier
Inscription : octobre 2007
Messages : 2 163
Détails du profil
Informations personnelles :
Nom : Homme Thierry Leriche-Dessirier
Localisation : France

Informations forums :
Inscription : octobre 2007
Messages : 2 163
Points : 5 926
Points : 5 926
Par défaut Position de l'ajout d'un bouton

Bonjour à tous,

J'ai ajouté un bouton dans un JFrame :

Code :
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
 
public class ChienJFrame5 extends JFrame {
 
	/**
	 * serialVersionUID
	 */
	private static final long serialVersionUID = -638731145561555723L;
 
	private static final Logger LOGGER = Logger.getLogger(ChienJFrame5.class);
 
	public ChienJFrame5() {
		super();
		setTitle("Liste des chiens (v5)");
		setPreferredSize(new Dimension(500, 400));
		setDefaultCloseOperation(EXIT_ON_CLOSE);
 
		final JPanel boutons = new JPanel();
		boutons.add(new JButton(new AjouterLigneAction()));
		getContentPane().add(boutons, SOUTH);
 
		final JTable tableau = new JTable(new ModeleDynamique2());
		getContentPane().add(tableau.getTableHeader(), NORTH);
		getContentPane().add(new JScrollPane(tableau), CENTER);
 
		tableau.setDefaultRenderer(Sexe.class, new SexeCellRenderer());
		tableau.setDefaultRenderer(RaceDeChien.class, new RaceCellRenderer());
 
		tableau.getColumnModel().getColumn(4).setCellRenderer(new ListeCouleursCellRenderer());
 
		tableau.setAutoCreateRowSorter(true);
 
		final TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(tableau.getModel());
		tableau.setRowSorter(sorter);
 
		sorter.setSortable(0, false); // colonne Nom non triable
		sorter.setComparator(1, new StringSizeComparator()); // Tri sur le nb de
																// lettres
 
 
 
		pack();
	}
 
	private class AjouterLigneAction extends AbstractAction {
 
		/**
		 * serialVersionUID
		 */
		private static final long serialVersionUID = 7183768497443802311L;
 
		private AjouterLigneAction() {
			super("Ajouter");
			System.out.println("bouton");
		}
 
		@Override
		public void actionPerformed(ActionEvent e) {
			//LOGGER.debug("Click sur le bouton ajouter");
			System.out.println("lala");
		}
	}
 
}
Ca fonctionne très bien. Par contre, quand je déplace l'ajout du bouton, il n'est plus cliquable et je ne comprend pas...

Code :
1
2
3
4
 
		getContentPane().add(tableau.getTableHeader(), NORTH);
		getContentPane().add(new JScrollPane(tableau), CENTER);
		getContentPane().add(boutons, SOUTH);  // deplacée
Quelqu'un a une idée ?

Thierry
__________________
Thierry Leriche-Dessirier
Ingénieur Architecte JEE Freelance
Rédacteur pour Developpez
Professeur de Génie Logiciel à l'ESIEA

Page sur Developpez : http://thierry-leriche-dessirier.developpez.com
Site : http://www.icauda.com
Linked'in : http://www.linkedin.com/in/thierryler
Twitter : http://www.twitter.com/thierryleriche
thierryler est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2012, 22h46   #2
Népomucène
Membre Expert
 
Homme
Développeur java, access, sql server
Inscription : octobre 2005
Messages : 1 326
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Développeur java, access, sql server
Secteur : Industrie

Informations forums :
Inscription : octobre 2005
Messages : 1 326
Points : 2 236
Points : 2 236
ben déjà, avec la classe que tu as postée ci-dessus, je vois pas comment le code suivant peut fonctionner :
Code :
getContentPane().add(boutons,  SOUTH);
sinon, il faudrait tout poster, pour qu'on puisse essayer...
__________________
·· −· −−· ·· ·−· ··− −− ·· −− ··− ··· −· −−− −·−· − ·
· − −·−· −−− −· ··· ··− −− ·· −− ··− ·−· ·· −−· −· ··
D'abord qu'il marche. Ensuite qu'il soit rapide. Enfin qu'il soit agréable à utiliser.
First, make it work. Then, make it fast. Finally, make it user-friendly.
Erst, mach', dass es funktioniert. Dann, mach', dass es schnell geht, Zum Schluss mach' es benutzerfreundlich.
Népomucène est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2012, 22h52   #3
thierryler
Rédacteur
 
Avatar de thierryler
 
Homme Thierry Leriche-Dessirier
Inscription : octobre 2007
Messages : 2 163
Détails du profil
Informations personnelles :
Nom : Homme Thierry Leriche-Dessirier
Localisation : France

Informations forums :
Inscription : octobre 2007
Messages : 2 163
Points : 5 926
Points : 5 926
Je précise, c'est quand je fais ça que ça ne marche plus :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
public ChienJFrame5() {
		super();
		setTitle("Liste des chiens (v5)");
		setPreferredSize(new Dimension(500, 400));
		setDefaultCloseOperation(EXIT_ON_CLOSE);
 
		final JPanel boutons = new JPanel();
		boutons.add(new JButton(new AjouterLigneAction()));
		getContentPane().add(boutons, SOUTH);
 
		final JTable tableau = new JTable(new ModeleDynamique2());
		getContentPane().add(tableau.getTableHeader(), NORTH);
		getContentPane().add(new JScrollPane(tableau), CENTER);
		getContentPane().add(boutons, SOUTH);
 
		...
Je déplace juste la ligne

Code :
1
2
 
		getContentPane().add(boutons, SOUTH);
J'ai mis un zip en pièce jointe. Ca se passe dans ChienJFrame5. Attention l'IHM utilise ChienJFrame6 et non ChienJFrame5, donc il faut décommenter pour tester.
Fichiers attachés
Type de fichier : zip tp-chien-ihm-02.zip (35,5 Ko, 1 affichages)
__________________
Thierry Leriche-Dessirier
Ingénieur Architecte JEE Freelance
Rédacteur pour Developpez
Professeur de Génie Logiciel à l'ESIEA

Page sur Developpez : http://thierry-leriche-dessirier.developpez.com
Site : http://www.icauda.com
Linked'in : http://www.linkedin.com/in/thierryler
Twitter : http://www.twitter.com/thierryleriche
thierryler est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/12/2012, 10h14   #4
Népomucène
Membre Expert
 
Homme
Développeur java, access, sql server
Inscription : octobre 2005
Messages : 1 326
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Développeur java, access, sql server
Secteur : Industrie

Informations forums :
Inscription : octobre 2005
Messages : 1 326
Points : 2 236
Points : 2 236
Pourquoi tu l'ajoutes 2 fois ?
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public ChienJFrame5() {
		super();
		setTitle("Liste des chiens (v5)");
		setPreferredSize(new Dimension(500, 400));
		setDefaultCloseOperation(EXIT_ON_CLOSE);
 
		final JPanel boutons = new JPanel();
		boutons.add(new JButton(new AjouterLigneAction()));
		getContentPane().add(boutons, SOUTH);
 
		final JTable tableau = new JTable(new ModeleDynamique2());
		getContentPane().add(tableau.getTableHeader(), NORTH);
		getContentPane().add(new JScrollPane(tableau), CENTER);
		getContentPane().add(boutons, SOUTH);
__________________
·· −· −−· ·· ·−· ··− −− ·· −− ··− ··· −· −−− −·−· − ·
· − −·−· −−− −· ··· ··− −− ·· −− ··− ·−· ·· −−· −· ··
D'abord qu'il marche. Ensuite qu'il soit rapide. Enfin qu'il soit agréable à utiliser.
First, make it work. Then, make it fast. Finally, make it user-friendly.
Erst, mach', dass es funktioniert. Dann, mach', dass es schnell geht, Zum Schluss mach' es benutzerfreundlich.
Népomucène est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/12/2012, 11h18   #5
thierryler
Rédacteur
 
Avatar de thierryler
 
Homme Thierry Leriche-Dessirier
Inscription : octobre 2007
Messages : 2 163
Détails du profil
Informations personnelles :
Nom : Homme Thierry Leriche-Dessirier
Localisation : France

Informations forums :
Inscription : octobre 2007
Messages : 2 163
Points : 5 926
Points : 5 926
une seule fois. Mauvais copié collé sur le forum
__________________
Thierry Leriche-Dessirier
Ingénieur Architecte JEE Freelance
Rédacteur pour Developpez
Professeur de Génie Logiciel à l'ESIEA

Page sur Developpez : http://thierry-leriche-dessirier.developpez.com
Site : http://www.icauda.com
Linked'in : http://www.linkedin.com/in/thierryler
Twitter : http://www.twitter.com/thierryleriche
thierryler est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/12/2012, 14h02   #6
Népomucène
Membre Expert
 
Homme
Développeur java, access, sql server
Inscription : octobre 2005
Messages : 1 326
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Développeur java, access, sql server
Secteur : Industrie

Informations forums :
Inscription : octobre 2005
Messages : 1 326
Points : 2 236
Points : 2 236
Bon j'ai trouvé où ça cloche.
Le bouton n'y est pour rien.

tu as écris :
Code :
1
2
3
4
 
		getContentPane().add(tableau.getTableHeader(), NORTH);
		getContentPane().add(new JScrollPane(tableau), CENTER);
		getContentPane().add(boutons, SOUTH);
et ça plante avec un paquet d'erreurs qui ont l'air d'être récursives :
Citation:
Exception in thread "main" java.lang.NullPointerException
at java.awt.Container.addNotify(Container.java:2592)
at javax.swing.JComponent.addNotify(JComponent.java:4683)
at java.awt.Container.addNotify(Container.java:2592)
at javax.swing.JComponent.addNotify(JComponent.java:4683)
at java.awt.Container.addNotify(Container.java:2592)
at javax.swing.JComponent.addNotify(JComponent.java:4683)
at javax.swing.JRootPane.addNotify(JRootPane.java:735)
at java.awt.Container.addNotify(Container.java:2592)
at java.awt.Window.addNotify(Window.java:635)
at java.awt.Frame.addNotify(Frame.java:469)
at java.awt.Window.pack(Window.java:663)
at chien.ChienJFrame5.<init>(ChienJFrame5.java:40)
par contre si on ajoute le JScrollPane en dernier, ça marche
Code :
1
2
3
4
 
		getContentPane().add(tableau.getTableHeader(), NORTH);
		getContentPane().add(boutons, SOUTH);
		getContentPane().add(new JScrollPane(tableau), CENTER);
j'ai tenté de contourner en n'ajoutant le tableau qu'après :
Code :
1
2
3
4
5
6
        JScrollPane scroll = new JScrollPane();
        getContentPane().add(tableau.getTableHeader(), NORTH);
        getContentPane().add(scroll, CENTER); 
        getContentPane().add(boutons, SOUTH);     // jusque-là, ça marche
 
        scroll.setViewportView(tableau);     // là, ça marche plus
conclusion : ça ne vient pas du bouton mais du JScrollPane(tableau) qui doit être ajouté en dernier.
pourquoi ? je suppose que Swing doit placer une tâche quelque part dans l'EDT et qu'elle tourne en rond avec les autres ajouts.
__________________
·· −· −−· ·· ·−· ··− −− ·· −− ··− ··· −· −−− −·−· − ·
· − −·−· −−− −· ··· ··− −− ·· −− ··− ·−· ·· −−· −· ··
D'abord qu'il marche. Ensuite qu'il soit rapide. Enfin qu'il soit agréable à utiliser.
First, make it work. Then, make it fast. Finally, make it user-friendly.
Erst, mach', dass es funktioniert. Dann, mach', dass es schnell geht, Zum Schluss mach' es benutzerfreundlich.
Népomucène est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/12/2012, 14h21   #7
thierryler
Rédacteur
 
Avatar de thierryler
 
Homme Thierry Leriche-Dessirier
Inscription : octobre 2007
Messages : 2 163
Détails du profil
Informations personnelles :
Nom : Homme Thierry Leriche-Dessirier
Localisation : France

Informations forums :
Inscription : octobre 2007
Messages : 2 163
Points : 5 926
Points : 5 926
Oui. C'est mon point de départ. Pourquoi ça marche avant mais pas après ?... Là, je cherche vraiment la cause profonde...

Donc si quelqu'un peut aider...
__________________
Thierry Leriche-Dessirier
Ingénieur Architecte JEE Freelance
Rédacteur pour Developpez
Professeur de Génie Logiciel à l'ESIEA

Page sur Developpez : http://thierry-leriche-dessirier.developpez.com
Site : http://www.icauda.com
Linked'in : http://www.linkedin.com/in/thierryler
Twitter : http://www.twitter.com/thierryleriche
thierryler est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2012, 12h04   #8
sinok
Modérateur
 
Avatar de sinok
 
Inscription : août 2004
Messages : 8 644
Détails du profil
Informations personnelles :
Âge : 33
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : août 2004
Messages : 8 644
Points : 12 452
Points : 12 452
Ce qui me semble poser problème ici est le fait que tu essaies d'ajouter le header du table dans la partie NORTH de ton BorderLayout alrs que ce header est ajouté automatiquement dans la bordure nord du jscrollpane.

Ce qui fait qu'un même composant est bindé à deux endroits différents, ce qui est potentiellement la source de l'erreur.

Enlève la ligne suivante:
Code :
getContentPane().add(tableau.getTableHeader(), NORTH);
Elle me semble parfaitement inutile.
__________________
Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.
sinok est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 28/12/2012, 12h37   #9
Népomucène
Membre Expert
 
Homme
Développeur java, access, sql server
Inscription : octobre 2005
Messages : 1 326
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Développeur java, access, sql server
Secteur : Industrie

Informations forums :
Inscription : octobre 2005
Messages : 1 326
Points : 2 236
Points : 2 236
Oua ! bien vu le radar à bug
je viens d'essayer, ça marche.
C'est Thierry qui va être content !
__________________
·· −· −−· ·· ·−· ··− −− ·· −− ··− ··· −· −−− −·−· − ·
· − −·−· −−− −· ··· ··− −− ·· −− ··− ·−· ·· −−· −· ··
D'abord qu'il marche. Ensuite qu'il soit rapide. Enfin qu'il soit agréable à utiliser.
First, make it work. Then, make it fast. Finally, make it user-friendly.
Erst, mach', dass es funktioniert. Dann, mach', dass es schnell geht, Zum Schluss mach' es benutzerfreundlich.
Népomucène est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2012, 12h59   #10
thierryler
Rédacteur
 
Avatar de thierryler
 
Homme Thierry Leriche-Dessirier
Inscription : octobre 2007
Messages : 2 163
Détails du profil
Informations personnelles :
Nom : Homme Thierry Leriche-Dessirier
Localisation : France

Informations forums :
Inscription : octobre 2007
Messages : 2 163
Points : 5 926
Points : 5 926
C'est énorme...

Merci à tous pour l'aide.
__________________
Thierry Leriche-Dessirier
Ingénieur Architecte JEE Freelance
Rédacteur pour Developpez
Professeur de Génie Logiciel à l'ESIEA

Page sur Developpez : http://thierry-leriche-dessirier.developpez.com
Site : http://www.icauda.com
Linked'in : http://www.linkedin.com/in/thierryler
Twitter : http://www.twitter.com/thierryleriche
thierryler est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 11h36.


 
 
 
 
Partenaires

Hébergement Web