Avant que quiconque suggère HTML, j'explique plus tard pourquoi cela n'est pas une option ici. J'ai une table contenant une colonne avec des cellules de texte. Je dois être capable de mettre en évidence une partie du texte de chaque cellule. Donc, par exemple, si la cellule contenait "chat foo chien" ... je voudrais peut-être mettre en évidence FOO. P>
Ma méthode actuelle consiste à utiliser une nappellrender personnalisée qui met HTML dans un composant JLABEL qui est rendu et une fois, il était bon. Ensuite, j'ai remarqué que lorsque le texte de la cellule est devenu trop long pour s'adapter à la largeur de la colonne, il suffit de tronquer le texte sans la normale "..." qui se produit normalement dans ce cas. Ainsi, les utilisateurs ne savaient pas qu'il y avait plus de texte qu'ils ne voyaient pas. L'autre problème était que si le texte original lui-même contenait HTML, qui, dans mon cas, la cellule ne rendrait pas correctement. Je sais que je pourrais simplement échapper au HTML mais j'aurais toujours le problème précédemment. p>
Si j'utilise un composant autre qu'un jlabel, il fait que les cellules de ma table ont l'air étrange. Est-ce que quelqu'un a des suggestions? Merci p>
3 Réponses :
Eh bien, voici une solution.
En bref, vous pouvez sousclure Voici cette réponse dans les détails d'ajustement: p> Fondamentalement, vous pouvez faire une sous-classe de Ajoutez une méthode qui indique à l'étiquette que la pièce à mettre en évidence. Cela pourrait être quelque chose comme ça, en supposant que vous ayez besoin d'une région surlignée: p> Si vous avez besoin de plusieurs régions, il suffit d'avoir une arrayliste au lieu d'un champ simple. Une méthode de déhightlighing serait probablement utile aussi. P> Maintenant, vous devez remplacer la méthode jlabel code> pour dessiner la surbrillance manuellement. Remplacement de la méthode
PaintComponent Code> Pour faire le dessin actuel et utilisez
FontMetrics code>
pour calculer l'endroit où la région en surbrillance doit être dessinée. P> jlabel code> qui peut mettre en évidence des choses. Je ferais cela comme ça; Vous voudrez peut-être le faire quelque peu différemment: p>
PaintComponent code> de
jlabel code>. Ici, vous devez faire plusieurs étapes discrètes, que vous voudrez peut-être organiser dans différentes méthodes ou quelque chose. Pour la simplicité, je vais tout mettre dans la méthode de la peinture. P>
g.fillRect(startX, startY, length, height);
super.paintComponent(g);
}
Wow, merci pour votre réponse. Cela fonctionne presque parfaitement pour les jlabels. Cependant, j'ai rencontré un seul problème. Si l'étiquette est SETOPAQUE (vraie) comme requise dans ma situation, il provoque la mise en évidence pour ne pas apparaître. Ceci, je pense, est causé par l'appelant Super.Painchcomponent (g) après avoir fait le dessin personnalisé. J'ai essayé de faire le dessin personnalisé de la surbrillance en premier, mais le rectangle en surbrillance attire le texte à surveiller. C'est une longue histoire mais pour obtenir des bandes de table et d'autres choses telles que la mise en évidence de la ligne pour se présenter dans mon cas, je dois définir l'étiquette sur Opaque. Merci pour la réponse.
Eh bien, essayez d'appeler Super.paincomponent (g) code> d'abord, et utilisez
g.setcolor code> pour définir la couleur sur quelque chose de partiellement transparent (par exemple,
nouvelle couleur (0x33, 0x66 , 0xFF, 0x66) CODE> est un joli bleu) avant d'appeler
FLIDRECT code>.
À la fin, j'ai fini par ré-mettre en œuvre ma propre méthode de composant de peinture à quelque chose qui a fonctionné à mes fins. Et a abandonné l'appelant la méthode du composant de peinture parent. Vous répondez était une très bonne et une solution plutôt bonne pour répondre au titre de ce post, ce qui concerne un jlabel, donc je la marquerai comme acceptée. Merci un bouquet tikhon.
C'est une excellente réponse, et probablement la meilleure solution. Mais une alternative que certains pourraient trouver plus simple consiste à utiliser un jtextfield au lieu d'un jlabel pour le rendu, alors vous pouvez utiliser JTextfields illustrant des capacités, c'est-à-dire
void highlightWhitespaceText(JTextField text) { text.setHighlighter(AbstractTableCellRenderer.defaultHighlighter); try { Matcher m = AbstractTableCellRenderer.whitespaceStartPattern.matcher(text.getText()); if (m.matches()) { text.getHighlighter().addHighlight(m.start(1), m.end(1), AbstractTableCellRenderer.highlightPainter); } m = AbstractTableCellRenderer.whitespaceEndPattern.matcher(text.getText()); if (m.matches()) { text.getHighlighter().addHighlight(m.start(1), m.end(1), AbstractTableCellRenderer.highlightPainter); } } catch (BadLocationException ble) { // } }
ne peut pas résister à jeter le mécanisme de décoration Renderer Swingx dans la bague: sa façon de résoudre l'exigence est de mettre en œuvre un surligneur le faire. En fait, ce qui est déjà fait (bien que pas encore à la charge officielle) mais caché dans le projet SwingLabs-Demos, nommé x / correspondanttexthagleter (vous auriez besoin de la fois) et récemment fixé pour faire face aux icônes, RTOL -Componentorientation, alignement, ellipses .. p>