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 ?
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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.
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" <tatin.dsatec@wanadoo.fr> a écrit dans le message news:
bvl9jn$fs3$1@news-reader1.wanadoo.fr...
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 ?
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.
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) {
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.
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)
{
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.
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) {
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.