JTable et ComboBox, que du bonheur... [Résolu]

Messages postés
42
Date d'inscription
mercredi 2 avril 2003
Statut
Membre
Dernière intervention
6 janvier 2005
- - Dernière réponse : The Red Man
Messages postés
112
Date d'inscription
vendredi 15 avril 2005
Statut
Membre
Dernière intervention
13 juin 2010
- 13 juin 2010 à 21:12
Bonjour à tous,

Comme l'indique le titre du post, mon problème vient de l'intégration d'une ComboBox dans une JTable.

En fait, le problème vient du fait que mon cahier des charges nécessite que je défasse la plupart des comportements par défaut mis en place par Sun sur le JTable, et celui qui me pose problème c'est le comportement d'affichage et d'édition de la ComboBox.

J'ai bien réussi à définir une ComboBox par colonne, pas de problème là dessus. Cependant, si vous regardez bien le comportement d'une JTable, vous verrez que lorsque l'on fait apparaître un Editor, si l'on ne saisit rien et que l'on clique ailleurs dans la fenêtre, l'Editor perd le focus, mais ne rend pas la main au Renderer, ce qui laisse une case d'édition sans focus toute moche au milieu du tableau.

On me demande de virer celà.
J'ai réussi à le faire avec les champs normaux (JTextField), en faisant en sorte d'envoyer un fireEditingStopped() sur évènement de perte de focus, et ça marche nickel.

Mais avec les JComboBox ça ne marche pas du tout, et j'obtiens un comportement merdique... :-/
Et je n'arrive pas à comprendre d'où ca vient, donc forcemment je n'arrive pas à corriger...

Est ce que quelqu'un a déjà été confronté au problème ou est capable de m'aider là dessus ? Y'a t'il quelqu'un qui aime le challenge ? ;)

Merci d'avance,
Afficher la suite 

Votre réponse

10 réponses

Meilleure réponse
Messages postés
42
Date d'inscription
mercredi 2 avril 2003
Statut
Membre
Dernière intervention
6 janvier 2005
3
Merci
Non non, rien à voir (j'ai aussi fait mon CellRenderer). Le problème ne vient pas du Renderer, mais du fait que l'editor ne passe pas la main au renderer.

Mais c'est bon, j'ai fini par trouver tout seul en m'acharnant. J'ai bricolé un peu l'éditeur de la combobox (oui oui) et de manière totalement inattendue ça a fini par marcher :)

Si ça interesse quelqu'un, je suis toujours à l'écoute.

P.S: je met réponse acceptée pour que les gens qui se balladent dans la liste des sujets sachent qu'il ya eu une solution à celui là...

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 145 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Pimousse77
Messages postés
2116
Date d'inscription
samedi 8 novembre 2003
Statut
Contributeur
Dernière intervention
6 octobre 2012
9
0
Merci
GodConan :clown)

non mais moi je change aussi le renderer ... essaye ca pour voir...

gl
++
Commenter la réponse de cs_GodConan
Messages postés
174
Date d'inscription
lundi 23 septembre 2002
Statut
Membre
Dernière intervention
6 avril 2011
1
0
Merci
Salut

Bah je suis intéressé de voir ca...

tu peux me faire parvenir ton code?

8-) JB@WAre
Commenter la réponse de JBAware
Messages postés
42
Date d'inscription
mercredi 2 avril 2003
Statut
Membre
Dernière intervention
6 janvier 2005
0
Merci
Voilà le morceau qui t'interesse :
Peux tu me dire ce que tu veux en faire et si ça t'a servi s'il te plaît ?

class TDDefaultCellEditor extends DefaultCellEditor {

/** Un lien vers le tableau contenant cet "Editor" */
private TDJTable tableau = null;

/**
* Crée un TableCellEditor sous forme de JComboBox.
*
* @param combobox la JComboBox à utiliser.
* @param tableauPasse l'instance du tableau ou insérer l'editor.
*/
protected TDDefaultCellEditor(JComboBox combobox, TDJTable tableauPasse) {

super(combobox);
tableau = tableauPasse;
combobox.setEditor(new MyMetalComboBoxEditor(tableau, this));
}

/**
* Crée un TableCellEditor sous forme de JTextField.
*
* @param combobox le JTextField à utiliser.
* @param tableauPasse l'instance du tableau ou insérer l'editor.
*/
protected TDDefaultCellEditor(JTextField textfield, TDJTable tableauPasse) {

super(textfield);
tableau = tableauPasse;

editorComponent.addFocusListener(new FocusAdapter() {

public void focusLost(FocusEvent fe) {

if(tableau.hasColumnChanged())
fireEditingStopped();

tableau.setColumnChanged(true);
}
});

editorComponent.setBorder(BorderFactory.createMatteBorder(1, 1, 1, 1, Color.BLACK));
}
}

/** Un éditeur personnalisé pour les comboBox du TDJTable */
class MyMetalComboBoxEditor extends MetalComboBoxEditor {

/** Un lien vers le tableau contenant cet "Editor" */
private TDJTable tableau = null;

/** L'instance de l'editor contenant la JComboBox dont cet objet est l'éditeur */
private TableCellEditor cellEditor = null;

/** Texte contenu dans la JComboBox */
private String texte = null;

public MyMetalComboBoxEditor(TDJTable tableauPasse, TableCellEditor editorPasse) {

super();
tableau = tableauPasse;
cellEditor = editorPasse;

editor.addFocusListener(new FocusListener() {

public void focusGained(FocusEvent fe) {

texte = editor.getText();
tableau.setColumnChanged(true);
}

public void focusLost(FocusEvent fe) {

if(editor.getText().equals(texte) && tableau.hasColumnChanged())
cellEditor.stopCellEditing();

tableau.setColumnChanged(true);
}
});
}
}
Commenter la réponse de Pimousse77
Messages postés
174
Date d'inscription
lundi 23 septembre 2002
Statut
Membre
Dernière intervention
6 avril 2011
1
0
Merci
Oui bien sur,

Je développe une appli à titre perso avec plusieurs Jtable.
j'allais faire un filtre avec une fenêtre différente qui contiendrai plusieurs combos.

Mais le fait de les insérés directement dans la Jtable sera je pense plus facile d'utilisation et en fait l'idée m'est venue en lisant ton post.

En tout cas merci

8-) JB@WAre
Commenter la réponse de JBAware
Messages postés
42
Date d'inscription
mercredi 2 avril 2003
Statut
Membre
Dernière intervention
6 janvier 2005
0
Merci
Ok mais le code que je te passe là est "spécial".

Si tu as bien tout lu, le but de ce code est de supprimer le comportement par défaut de Sun qui laisse parfois les editeurs de cellule activés quand ils perdent le focus.

Si tu veux simplement ajouter des JComboBox dans ta JTable il te suffit de créer des

new DefaultCellEditor(JcomboBox maCombo);
Commenter la réponse de Pimousse77
Messages postés
174
Date d'inscription
lundi 23 septembre 2002
Statut
Membre
Dernière intervention
6 avril 2011
1
0
Merci
En effet j'ai bien tout lu et j'avais noté que le code supprimait le comportement Sun

Par contre je n'avais pas pensé au DefaultCellEditor que j'essaierai dès que possible.

Je garde quand même ton code sous le coude

Merci encore

8-) JB@WAre
Commenter la réponse de JBAware
Messages postés
54
Date d'inscription
lundi 29 septembre 2003
Statut
Membre
Dernière intervention
4 décembre 2005
0
Merci
Dites y a personne qui peux me dire comment recuperer les infos d'une
JTable composee de divers JComboBox en appuyant sur un bouton externe
au JTable ?

J'arrive qu'a recuperer un 'null' avec .getValueAt(r, c) . J'ais pas
encore teste tes classes, c'est peut etre le renderer qui deconne chez
moi (j'ai aussi des cellules vides a la place des JCB avant de cliquer
dessus et de selectionner une valeur) et qui fait qu'il n'y a aucune
valeur dans la cellule meme apres selection d'une valeur du JCB.

Voila merci d'avance.
Commenter la réponse de bastet1978
Messages postés
3
Date d'inscription
vendredi 3 septembre 2004
Statut
Membre
Dernière intervention
18 janvier 2008
0
Merci
En cherchant dans le code source de JTable, pour répondre au post original de [auteur/PIMOUSSE77/78715.aspx Pimousse77], j'ai trouvé qu'il suffisait uniquement d'écrire cette ligne :
nom_de_la_JTable.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);
J'ai trouvé cette info dans le code source de JTable, dans la sous-classe CellEditorRemover.
Commenter la réponse de jrdasm
Messages postés
112
Date d'inscription
vendredi 15 avril 2005
Statut
Membre
Dernière intervention
13 juin 2010
1
0
Merci
Comment peut-on faire pour ajouter un JCombobox à une seule cellule ?!

:(
Commenter la réponse de The Red Man