J'essaie de créer une table avec des en-têtes de colonne personnalisés. Je souhaite que les en-têtes de colonne incluent un bouton que les utilisateurs peuvent cliquer sur. La fonction du bouton sera de supprimer la colonne de la table. Essentiellement, j'essaie de construire quelque chose comme this .
Voici mon code: Par défaut, si je comprends correctement, JTable utilise un jlabel pour rendre les en-têtes de colonne. Mon idée est d'utiliser une implémentation personnalisée de la nappellrenderer et de construire mon propre en-tête de colonne sur plusieurs composants, à savoir un JPANEL contenant un Jlabel et un JButton. Je construis et renvoyez cela dans la fonction GettablecellRendererComponent (...). P> visuellement, cela fonctionne. Le problème est que je ne peux pas détecter les clics de souris sur le bouton (ou, dans ce domaine, sur le panneau qui le détient). Il suffit d'ajouter un mouselistener au bouton ne fonctionne pas. L'événement ne l'atteint jamais. P> J'ai trouvé plusieurs choses similaires sur le Web, mais elles n'atteignent pas la fonctionnalité dont j'ai besoin. P> Premièrement, il y a un exemple de comment mettre une boîte à JCHECKBOX Dans l'en-tête, ici: p> Le problème avec ceci est que l'en-tête entier est la case à cocher. En cliquant sur la case à cocher ou sur l'étiquette associée, produit le même effet. Ainsi, il n'est pas possible de trier la colonne. J'aimerais le faire pour cliquer sur l'étiquette Trier la colonne et cliquer sur le bouton Fermer enlève la colonne de la table. En d'autres termes, l'en-tête doit avoir deux zones distinctes avec des gestionnaires d'événements de souris séparés. P> J'ai trouvé un autre exemple ici: p> Cela implique de placer des jbuttons dans les cellules de la table, puis détectant des clics de souris sur la table elle-même, calculant la colonne et la rangée dans laquelle le clic a eu lieu et envoie l'événement sur le bouton approprié. P> Les sont aussi nombreux. . Tout d'abord, les boutons sont dans les cellules, pas dans les en-têtes. Et deuxièmement, c'est à nouveau un seul composant, pas plusieurs composants dans un JPanel. Bien que j'ai eu l'idée d'envoi d'événements à partir de cet exemple, je ne peux pas le faire fonctionner pour un composant composite. P> J'ai essayé une autre approche. J'ai dit que si je peux obtenir les coordonnées des boutons de fermeture, connaître les coordonnées du clic de souris, je peux calculer quel bouton a été cliqué et expédiez l'événement de manière appropriée. J'ai parcouru plusieurs tests et découvert que les composants à l'intérieur de l'en-tête de la table ne sont pas réellement situés à l'écran. P> J'ai ajouté une variable jbutton statique à ma classe principale (publique) et a créé la classe qui implémente la nappellrenderer un classe intérieure de la classe principale. Dans GettablecellRendererComponent (...), avant de retourner, j'ignore le JButton que je viens de créer à cette variable statique. De cette façon, je peux avoir une poignée dessus, pour ainsi dire. Ensuite, dans Main, j'ai essayé de getex (), Gety (), GetWidth (), GetChip () et GetLocationVoiscreen () en utilisant cette variable statique. X, y, largeur et hauteur tout retourne 0. GetLocationVoyonscreen () bloque le programme, disant que le composant doit être présent à l'écran de cette fonction pour fonctionner. P> Le code pour cela ressemble à ceci: P> X: 0
Y: 0
W: 0
H: 0
LOC: java.awt.Point[x=0,y=0]
Exception in thread "main" java.awt.IllegalComponentStateException: component must be showing on the screen to determine its location
at java.awt.Component.getLocationOnScreen_NoTreeLock(Component.java:1943)
at java.awt.Component.getLocationOnScreen(Component.java:1917)
...
3 Réponses :
Oui, j'étais surpris la première fois que j'ai essayé de faire quelque chose de similaire, comme mettre un Dans votre cas, j'essaierais d'utiliser une combinaison de Une autre chose à surveiller est d'utiliser static Swing n'est pas aussi basculant parfois. Espérons que j'ai fourni des informations utiles - continuez à combattre la bonne bagarre! P> jbutton code> s dans un
jlist code> - il ne fonctionne pas assez pour les raisons pour lesquelles vous déclaré. La bonne façon de faire ce que je voulais utiliser un
LayoutManager code> pour placer le
jbutton code> s dans une liste. p>
jlabel code> s et
Mouselisteners code>, que je crois fonctionnera correctement. Utilisation d'un
jlabel code> car votre en-tête vous permettra de fournir une image et un texte, et vous pouvez enregistrer un
mouselistener code> sur le
jlabel code>. Certes, vous n'obtiendrez pas les mêmes effets visuels que vous le feriez lorsque vous cliquez sur un
jbutton code> (c'est-à-dire le bouton déprimant), mais cela permettra la même fonctionnalité. P>
jbutton code> s (ou tout
jcommonent code>). Le problème avec cela est que les coordonnées du
jbutton code> sont stockées dans le
jbutton code> elle-même, ce qui signifie que vous ne pouvez pas utiliser le même
jbutton code> à différents endroits. En d'autres termes, si vous essayez d'ajouter le même
statique jbutton code> à une liste plusieurs fois, vous ne verrez pas plusieurs
jbutton code> s, vous verrez juste le
Jbutton code> à l'emplacement que vous avez ajouté. La bonne façon d'atteindre votre effet souhaité est de conserver une référence statique au contenu em> du
jbutton code> - à savoir l'image et le texte - au lieu du
jbutton < / code> lui-même. Ensuite, il suffit d'instancier un nouveau
jbutton code> à l'aide de l'image et du texte et placez-le partout où vous le souhaitez. En général, il est préférable de rester à l'écart de garder les références statiques des composants toscopiques car il est impossible d'avoir plusieurs instances du même composant. P>
Merci! J'ai essayé quelque chose de similaire - décidé de simplement calculer si les clics tombent sur le bouton. Pour cela, j'ai besoin de garder le bouton en une seule place. Dites, c'est 16x16, et j'ai besoin de toujours garder 8 pixels à gauche du bord de la colonne. Bien que j'ai pu faire cela en utilisant des boîtes et une colle, je n'ai pas pu l'obtenir bien jouer avec le Jlabel. Dis, ma colonne ressemble à ceci: | Nom de la colonne [x] |. Si la colonne est reformulée, j'aimerais que cela ressemble | Colum ... [x] |. Iow, les ellipses doivent apparaître automatiquement. Au lieu de cela, le bouton peint sur l'étiquette. Des idées?
Vous pouvez utiliser JXTABLY (à partir de Palette Swingx) qui dispose de cette option pour "désactiver" une colonne particulière de votre table. P>
Andrei Ionut Apopée P>
J'ai eu la solution: