Bonjour et bonne année.

J'ai une application contenant entre autres une JTable dont les nombres de rangées et de colonnes peuvent varier. Le nombre total de colonnes varie suivant un nombre variable de colonnes (centrales et contigües) qui contiennent des JRadioButton's. Les JRadioButton's devraient interagir par rangée; pas par colonne.
Nom : JTable nbre col rang variable et JRadioButton.png
Affichages : 495
Taille : 19,5 Ko

Problème : Lorque l'utilisateur actionne un JRadioButton précédemment non sélectionné, aucun des deux JRadioButton's de la rangée ne change. Ceux des autres rangées restent inchangés, bien sûr.

J'ai réalisé un SSCCE qui consiste en une JTable aux dimensions non variables et ne contenant que des colonnes à JRadioButton's; Je vous l'ai déjà présenté dans une précédente question/discussion postée dans Developpez.com : http://www.developpez.net/forums/d15...roupes-rangee/. Ce SSCCE fonctionne comme il faut mais il contient déjà quatre fichiers sources. C'est difficile d'ajouter à ce SSCCE, une à une, certaines autres fonctionnalités se trouvant dans mon application - p. ex. Colonne de numéros des rangées, ajustage des largeurs de colonne, couleurs de fonds des rangées, ... - car le volume de logiciel croîtrait fort et vite. Le SSCCE n'en serait plus un.

Les principales différences entre mon application et le SSCCE :
SSCCE :
- Les nombres de rangées et de colonnes sont fixes et déterminés à l'initialisation, c à d dans la méthode 'void initUI()' se trouvant dans la classe principale 'TestTable'.
Mon application :
- À la construction de la JTable, le nombre de rangées est 0 (hormis la rangée des entêtes de colonnes) et le nombre de colonnes est immuablement 10 et exempt de colonnes centrales dont chaque cellule contient un 'MonObjet', qui lui contient un 'JRadioButton'.
- Lors de l'entrée dans des certains champs d'entrée, un nombre variable de colonnes (dont chaque cellule contient un 'MonObjet', donc un JRadioButton's) viennent s'ajouter : + 1, 3, 7, ... colonnes. Ces ajoutes ou retraits dynamiques de colonnes sont gérés par les mêmes méthodes 'miseÀJourModEtStructTable' (dans la classe principale équivalente à 'TestTable') et 'élaborTtsRangéesDeLaTable()' (dans 'MonModTable') de mon application qui sont aussi appelées lors de l'initialisation. 'miseÀJourModEtStructTable' se termine par
monModTable.fireTableStructureChanged();
, soit bien après l'initialisation des JTable, JScrollPane, ColNumérTable, JTabbedPane, ..., JFrame.

- - - - - - - - - -

Parenthèse : Il y a deux familles de méthodes :
- Celles invoquées par des classes JTable, JTableModel, AbstractTableModel, JRadioButton et probablement d'autres encore (Toujours des noms en Anglais et dont la déclaration commence par '@Override'), telles que 'getRowCount', 'getColumnCount', 'getCellRenderer', 'prepapreRenderer', 'getValueAt', 'setValueAt', 'propertyChange', 'getTableCellRendererComponent', 'getTableCellEditorComponent', 'getCellEditorValue', 'actionPerformed'.
- Celles invoquées par mes propres méthodes (Systématiquement en une autre langue que l'Anglais; ici en Français)

Dans la classe principale du SSCCE (TestTable), on notera qu'à la fin de la méthode 'initUI()', ne figure pas une instruction telle que 'fireTableStructureChanged()', qui aurait déclaré le nouveau nombre de colonnes à la librairie de JTable. Celle-ci a besoin de savoir ce nombre pour tous ses appels de 'getValueAt()', setValueAt() ...

À l'aide de mon IDE (Netbeans 8.0 = super), j'ai relevé les séquences des appels de méthodes par JTable et consorts (JTableModel, ... ), lors de l'utilisation du SSCCE. Particulièrement
- Au lancement du SSCCE
- Lorsque le curseur entre dans la surface occupée par la JTable (voir ci-dessous)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
Le curseur entre dans la case pour y actionner le bouton-radio
@ getRowCount()			dans 'MonModTable'	4 x	
@ getColumnCount()		dans 'MonModTable'
[columnCount] fois x [rowCount] fois
| @ getCellRenderer()		dans 'TestTable'	
| 	getColumnCount()	dans 'MonModTable'
| @ prepareRenderer()		dans 'TestTable'	
| 	super.prepareRenderer()	dans 'TestTable'	
| 		@ getValueAt()	dans 'MonModTable'	
| 			getValeurÀ()	dans 'MonModTable'	
| 			isSélectionné()	dans 'MonModTable'	
| 		@ getTableCellRendererComponent() dans 'RendEdit_CellBoutRad'
- Lorsqu'un JRadioButton est actionné (bouton gauche de la souris actionné - voir ci-dessous)
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
@ getRowCount()			dans 'MonModTable'	3 x	
@ isCellEditable(0,1)		dans 'MonModTable'
@ getValueAt(0,1)		dans 'MonModTable'	
	getValeurÀ(0,1)		dans 'MonModTable'	
	isSélectionné()		dans 'MonModTable'	false
@ getTableCellEditorComponent(0,1)	dans 'RendEdit_CellBoutRad'	
	boutonRadio.setSelected(0,1)	dans 'RendEdit_CellBoutRad'	
@ getRowCount()			dans 'MonModTable'	20x
@ actionPerformed()		dans 'TestTable'
	stopCellEditing()	dans 'TestTable'
@ getCellEditorValue()		dans 'TestTable'
@ setValueAt(0,1)		dans 'MonModTable'	
	getValeurÀ(0,1)		dans 'MonModTable'	
	setSélectionné()	dans 'MonObjet'	
		miseàjourTousBP_Rangée	dans 'GestionnObjetsDUneRangée'
			[nbreCol] fois	Méthode ré-entrante
			| setSélectionné()	dans 'MonObjet'
			| 	(miseàjourTousBP_Rangée	dans 'GestionnObjetsDUneRangée')
			| 	suppChanProp_Obj.firePropertyChange("juistVeranderd") dans 'MonObjet'
			|	@ propertyChange	dans 'MonModTable'
			|		fireTableRowsUpdated()	
		suppChanProp_Obj.firePropertyChange("juistVeranderd") dans 'MonObjet'
		@ propertyChange	dans 'MonModTable'
			fireTableRowsUpdated()	
@ getRowCount()			dans 'MonModTable'	
@ actionPerformed()		dans 'TestTable'
	stopCellEditing()	dans 'TestTable'
J'ai relevé ces séquences afin de détecter toute différence entre le fonctionnement OK du SSCCE et le fonctionnement NOK de mon application.

Dans le relevé de la séquence des appels, on observe que 'getRowCount()' et 'getColumnCount()' sont les premières instructions appelés par JTable ... lors de l'initialisation du SSCCE et de mon application.
Cependant, bizarement, 'getColumnCount()' n'est pas appelée lorsqu'un bouton-radio a été actionné, c à d lorque'une cellule de la table passe sous le curseur. (Mais 'isCellEditable()' l'est, comme on peut s'y attendre)
J'en déduis que JTable et autres méthodes de la librairie vérifie(nt) le nombre de colonnes à chaque sélection d'une cellule de la table; pas rien qu'à l'initialisation de la table. C'est ce qu'il faut pour des tables à nombres de colonnes et rangées variables.

Dans le ficher-source 'MonModTable' de mon application, j'ai programmé une méthode dont l'une des quelques tâches est d'insérer ou supprimer un nombre de colonnes de boutons-radio. Le problème est qu'après que cette méthode ait exécuté toutes ses tâches d'ajustage du nombre de colonnes, et qu'après qu'un bouton-radio ait été actionné, JTable ... n'appelle pas 'getTableCellEditorComponent(...)', comme on observe qu'il le fait à l'exécution du SSCCE. Il s'agit d'une méthode appartenant à la classe 'RendEdit_CellBoutRad', incluse dans la classe principale 'TestTable'.

J'expose le problème suffisamment clairement ?
À quelles vérifications n'ai-je pas encore pensé ?
Quel appel de méthode de JTable (ou autre) devrais-je insérer à la fin de mes méthodes pour que dans mon application comme dans le SSCCE, "JTable et consorts" réalisent quel est le nouveau nombre de colonnes et pour que la séquence d'appels de méthodes '@Override ...' ne soit plus avortée juste avant 'getTableCellEditorComponent' ?

Merci bcp à ceux qui tentent de me répondre, ainsi qu'à 'Developpez'.
Je vous souhaite bien du succès en 2017.