OVH Cloud OVH Cloud

JTAble + TableCellRenderer dans le header

2 réponses
Avatar
narberd
Bonjour,

J'ai une belle JTable. Je veux mettre des boutons dans les en-t=EAtes de =

certaines colonnes. Pour cela, je cr=E9e une classe HeaderRenderer qui=20
impl=E9mente TableCellRenderer et ActionListener. A la cr=E9ation de la=20
JTable, je fais un
jTable.getTableHeader().setDefaultRenderer(new HeaderRenderer());
et mes en-t=EAtes de colonnes affichent bien mes boutons avec le bon text=
e=20
et les bons ic=F4nes. Tout va bien pour l'affichage.

Pour la gestion des events, c'est un autre probl=E8me.

Dans le HeaderRenderer, je dis =E0 mon JButton :
theButton.addActionListener(this);
et je d=E9clare la m=E9thode :
public void actionPerformed(ActionEvent e)
{
System.out.println("actionPerformed");
}

Lorsque je clique sur le header de la colonne, il ne se passe rien. Pas=20
d'effet visuel montrant que le bouton =E0 =E9t=E9 sollicit=E9, =E0 la con=
sole, pas=20
de trace du println.

Est-ce que quelqu'un a une id=E9e de ce qui se passe ? Que faut-il faire =

pour que mon bouton re=E7oive les clicks de souris ?

Merci d'avance,

Narberd.

2 réponses

Avatar
news.wanadoo.fr
Salut,

j'ai tendance à dire que ce que tu fais n'est qu'un renderer, cad qu'il met
seulement
en forme le texte à afficher de la manière dont tu veux qu'il le soit. La
JTable n'a donc aucune
raison de lui transmettre des evts, et donc ton action n'est jamais
declenchee. Pour les cellules
'normales' de la table, il est possible de definir un editeur auquel la
table va transmettre certains
evenements, mais ce n'est pas le cas pour le header.
Si ce que tu veux faire, c'est savoir quand l'utilisateur a clique sur le
header, c'est possible en
ajoutant un MouseListener sur la table et en interpretant les clics avec
cette methode:
int columnAtPoint(Point point)
Elle se trouve dans la classe JTableHeader.

Sinon je ne vois pas d'autre solution à ton problème.

Jocelyn Lecomte

"narberd" a écrit dans le message news:
bvl9jn$fs3$
Bonjour,

J'ai une belle JTable. Je veux mettre des boutons dans les en-têtes de
certaines colonnes. Pour cela, je crée une classe HeaderRenderer qui
implémente TableCellRenderer et ActionListener. A la création de la
JTable, je fais un
jTable.getTableHeader().setDefaultRenderer(new HeaderRenderer());
et mes en-têtes de colonnes affichent bien mes boutons avec le bon texte
et les bons icônes. Tout va bien pour l'affichage.

Pour la gestion des events, c'est un autre problème.

Dans le HeaderRenderer, je dis à mon JButton :
theButton.addActionListener(this);
et je déclare la méthode :
public void actionPerformed(ActionEvent e)
{
System.out.println("actionPerformed");
}

Lorsque je clique sur le header de la colonne, il ne se passe rien. Pas
d'effet visuel montrant que le bouton à été sollicité, à la console, pas
de trace du println.

Est-ce que quelqu'un a une idée de ce qui se passe ? Que faut-il faire
pour que mon bouton reçoive les clicks de souris ?

Merci d'avance,

Narberd.
Avatar
narberd
news.wanadoo.fr wrote:

Salut,

j'ai tendance à dire que ce que tu fais n'est qu'un renderer, cad qu' il met
seulement
en forme le texte à afficher de la manière dont tu veux qu'il le so it. La
JTable n'a donc aucune
raison de lui transmettre des evts, et donc ton action n'est jamais
declenchee.


De ce point de vue, le comportement de mon programme est donc normal -
je n'ai pas fais de trop grosse connerie.

Pour les cellules 'normales' de la table, il est possible de definir un editeur auquel la
table va transmettre certains
evenements, mais ce n'est pas le cas pour le header.


C'est bien dommage !

Si ce que tu veux faire, c'est savoir quand l'utilisateur a clique sur le
header, c'est possible en
ajoutant un MouseListener sur la table et en interpretant les clics ave c
cette methode:
int columnAtPoint(Point point)
Elle se trouve dans la classe JTableHeader.

J'utilise plutôt un MouseAdapter - je ne trouve pas cela reluisant mais

je refile l'évenement souris au bouton depuis mon MouseAdapter - que je
plugge au header de la JTable :

...
jTable.getTableHeader().addMouseListener(new LocalMouseAdapter());
...
class LocalMouseAdapter extends MouseAdapter
{
public void mouseClicked (MouseEvent e)
{
TableColumnModel columnModel = jTable.getColumnModel ();
int viewColumn = columnModel.getColumnIndexAtX (e.getX ()) ;
int column = jTable.convertColumnIndexToModel (viewColumn) ;
if (e.getClickCount () == 1 && column != -1)
{

HeaderRenderer hr =
(HeaderRenderer)jTable.getTableHeader().getDefaultRenderer();
hr.onClickCol(column);
}
}
}

public class HeaderRenderer
{
...
public void onClickCol(int column)
{
if (theButton != null)
{
currentColumn = idx;
theButton.doClick(count);
}
}
...
}

Ca fonctionne donc, mais je trouve la chose un peu bricole.

Il n'empêche que - en réfléchissant un peu - si le click de souris
arrive directement au bouton, comment puis-je savoir à quelle colonne i l
appartient ? Au bout du compte, la solution n'est pas si mauvaise que cel a.

Sinon je ne vois pas d'autre solution à ton problème.

Jocelyn Lecomte




Merci,

Narberd.