Je veux fondamentalement implémenter de changer la couleur des liens quand je les survole. L'HyperlinkEvent qui est déclenché lorsque je souris sur le lien me donne l'élément HTML, mais il ne me laisse pas définir d'attributs de style, et je n'arrive pas à comprendre comment obtenir les éléments qui ont des attributs réglables.Comment puis-je changer la couleur d'un élément particulier d'un HTMLDocument dans un JEditorPane?
Comment puis-je changer la couleur d'un élément particulier d'un HTMLDocument dans un JEditorPane?
Répondre
Je compris ce que je voulais faire en utilisant des documents stylés et peu d'aide de la HTMLEditorKit:
public class HighlightHyperlinkExample {
private static Element lastHyperlinkElementEntered;
private static JEditorPane textPane;
public static void main(String[] args) {
textPane = new JEditorPane();
textPane.setContentType(new HTMLEditorKit().getContentType());
JScrollPane scrollPane = new JScrollPane(textPane);
textPane.setText(
"Sample text with <a href=\"x\">a link</a> and another <a href=\"x\">link</a>.");
initListeners();
JFrame frame = new JFrame();
frame.add(scrollPane);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
private static void initListeners() {
textPane.addMouseListener(new MouseAdapter() {
@Override
public void mouseExited(MouseEvent e) {
removeHyperlinkHighlight();
}
});
textPane.addMouseMotionListener(new MouseMotionListener() {
public void mouseDragged(MouseEvent e) {
}
public void mouseMoved(MouseEvent e) {
Point pt = new Point(e.getX(), e.getY());
int pos = textPane.viewToModel(pt);
if (pos >= 0) {
HTMLDocument hdoc = (HTMLDocument) textPane.getDocument();
Element elem = hdoc.getCharacterElement(pos);
if (elem != null) {
AttributeSet a = elem.getAttributes();
AttributeSet anchor = (AttributeSet) a.getAttribute(HTML.Tag.A);
if (anchor != null) {
//only highlight anchor tags
highlightHyperlink(elem);
} else {
removeHyperlinkHighlight();
}
}
}
}
});
}
private static void removeHyperlinkHighlight() {
changeColor(lastHyperlinkElementEntered, Color.BLUE);
lastHyperlinkElementEntered = null;
}
private static void highlightHyperlink(Element hyperlinkElement) {
if (hyperlinkElement != lastHyperlinkElementEntered) {
lastHyperlinkElementEntered = hyperlinkElement;
changeColor(hyperlinkElement, Color.RED);
}
}
private static void changeColor(Element el, Color color) {
if (lastHyperlinkElementEntered != null) {
HTMLDocument doc = (HTMLDocument) textPane.getDocument();
int start = el.getStartOffset();
int end = el.getEndOffset();
StyleContext ss = doc.getStyleSheet();
Style style = ss.addStyle("HighlightedHyperlink", null);
style.addAttribute(StyleConstants.Foreground, color);
doc.setCharacterAttributes(start, end - start, style, false);
}
}
}
Voir Highlighting Words in a JTextComponent.
JTextArea textComp = new JTextArea();
// Highlight the occurrences of the word "public"
highlight(textComp, "public");
// Creates highlights around all occurrences of pattern in textComp
public void highlight(JTextComponent textComp, String pattern) {
// First remove all old highlights
removeHighlights(textComp);
try {
Highlighter hilite = textComp.getHighlighter();
Document doc = textComp.getDocument();
String text = doc.getText(0, doc.getLength());
int pos = 0;
// Search for pattern
while ((pos = text.indexOf(pattern, pos)) >= 0) {
// Create highlighter using private painter and apply around pattern
hilite.addHighlight(pos, pos+pattern.length(), myHighlightPainter);
pos += pattern.length();
}
} catch (BadLocationException e) {
}
}
// Removes only our private highlights
public void removeHighlights(JTextComponent textComp) {
Highlighter hilite = textComp.getHighlighter();
Highlighter.Highlight[] hilites = hilite.getHighlights();
for (int i=0; i<hilites.length; i++) {
if (hilites[i].getPainter() instanceof MyHighlightPainter) {
hilite.removeHighlight(hilites[i]);
}
}
}
// An instance of the private subclass of the default highlight painter
Highlighter.HighlightPainter myHighlightPainter = new MyHighlightPainter(Color.red);
// A private subclass of the default highlight painter
class MyHighlightPainter extends DefaultHighlighter.DefaultHighlightPainter {
public MyHighlightPainter(Color color) {
super(color);
}
}
Merci. J'ai complètement oublié les surligneurs. Malheureusement, ce que je voulais faire était de changer le premier plan, pas le fond, ce qui est beaucoup plus difficile avec les surligneurs. Il m'a envoyé sur le bon chemin, cependant. Donc merci. –
Je voulais juste dire que lorsque j'ouvre votre lien [Mettre en évidence les mots dans un composant JText], il renvoie vers une page contenant un virus. – Tdorno
- 1. Changer la couleur d'un pixel
- 2. iPhone: comment changer la couleur d'une image
- 3. Comment changer la couleur UIPicker? iPhone
- 4. Comment changer la couleur d'un MenuItem Cocos2d?
- 5. Comment changer la couleur de la police dans VB6?
- 6. Changer la couleur de JFileChooser
- 7. Sélection d'éléments dans un JEditorPane
- 8. Changer la couleur de fond d'un UILabel dans un UITableViewCell
- 9. Sélectionnez un élément d'ancrage particulier via location.hash
- 10. Comment changer la couleur d'arrière-plan dans gnuplot?
- 11. Comment changer la couleur d'arrière-plan d'un Textblock dans Silverlight?
- 12. Changer la couleur de la date
- 13. Comment changer la couleur de scatterplot dans ggplot2
- 14. Comment définir la taille de l'onglet dans un JEditorPane?
- 15. Comment changer la couleur de la police d'un TextBox désactivé?
- 16. changer la couleur de titleFor-tête dans la section
- 17. Comment changer la couleur de la bordure du formulaire C#?
- 18. Changer la couleur du caret dans silverlight 2
- 19. Changer la couleur d'arrière-plan plein écran
- 20. Changer la couleur de DataGrid dans flash cs4
- 21. Dans Firefox, comment changer la couleur du texte dans un treecell en utilisant javascript
- 22. Comment changer la couleur d'arrière-plan du bouton
- 23. Comment changer la couleur de l'image à l'exécution
- 24. Flash/As3 - changer la couleur de focusRect
- 25. Comment changer la couleur du calendrier Outlook en C#?
- 26. Comment changer la couleur des lettres de sectionIndexTitlesForTableView?
- 27. Faire un contrôle actif changer la couleur d'arrière-plan
- 28. jquery: rechercher un élément dont l'identifiant a un motif particulier
- 29. Comment changer la couleur du texte de l'étiquette?
- 30. comment changer la couleur de winform DataGridview en-tête?
Envisagez de colorer la couleur réelle qui a été écrasée dans #highlightHyperlink et utilisez la couleur mémorisée dans #removeHyperlinkHighlight. – ordnungswidrig
Ce serait mieux pour cet exemple. –