Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

JEditorPane, clics, hyperliens

3 réponses
Avatar
Yliur
Bonjour

Je manipule un navigateur html (JEditorPane de l'API Java). Ce
composant est capable de g=E9n=E9rer un =E9v=E9nement particulier
(HyperlinkEvent) quand on clique sur un hyperlien de la page html
qu'il affiche.
Je voudrais d=E9tecter les clics sur les hyperliens (donc =E7a c'est
facile en inscrivant un =E9couteur sur ces =E9v=E9nements
[HyperlinkListener]). Et je voudrais aussi d=E9tecter des clics dans le
composant, mais en dehors des hyperliens (quand on clique sur le
fond du composant, l=E0 o=F9 il n'y a pas de lien). Et l=E0 c'est moins
facile, parce qu'il y a bien la possibilit=E9 d'inscrire un =E9couteur
sur les clics de souris (MouseListener), mais =E7a d=E9tecte tous les
clics de souris, y compris ceux sur les liens.

Est-ce clair ?

Une id=E9e pour d=E9tecter les clics de souris qui ne sont pas sur des
hyperliens ?

Merci

3 réponses

Avatar
Albert
Le 17/12/2009 23:16, Yliur a écrit :
Bonjour

Je manipule un navigateur html (JEditorPane de l'API Java). Ce
composant est capable de générer un événement particulier
(HyperlinkEvent) quand on clique sur un hyperlien de la page html
qu'il affiche.
Je voudrais détecter les clics sur les hyperliens (donc ça c'est
facile en inscrivant un écouteur sur ces événements
[HyperlinkListener]). Et je voudrais aussi détecter des clics dans le
composant, mais en dehors des hyperliens (quand on clique sur le
fond du composant, là où il n'y a pas de lien). Et là c'est moins
facile, parce qu'il y a bien la possibilité d'inscrire un écouteur
sur les clics de souris (MouseListener), mais ça détecte tous les
clics de souris, y compris ceux sur les liens.

Est-ce clair ?

Une idée pour détecter les clics de souris qui ne sont pas sur des
hyperliens ?



Oui, si tu fais:
* Point du click -> position dans le document
* puis tu récupère le style (les attributs) à la position
* tu regarde s'il n'y a pas un attribut qui définit le lien hypertexte

sinon, tu reparse le document complètement et tu regarde si la position
ne tombe pas dans un Element avec un style "lien hypertexte".


Merci


Avatar
Yliur
Le Fri, 18 Dec 2009 09:44:34 +0100
Albert a écrit :

Le 17/12/2009 23:16, Yliur a écrit :
> Bonjour
>
> Je manipule un navigateur html (JEditorPane de l'API Java). Ce
> composant est capable de générer un événement particulier
> (HyperlinkEvent) quand on clique sur un hyperlien de la page html
> qu'il affiche.
> Je voudrais détecter les clics sur les hyperliens (donc ça c'est
> facile en inscrivant un écouteur sur ces événements
> [HyperlinkListener]). Et je voudrais aussi détecter des clics
> dans le composant, mais en dehors des hyperliens (quand on clique
> sur le fond du composant, là où il n'y a pas de lien). Et là c'est
> moins facile, parce qu'il y a bien la possibilité d'inscrire un
> écouteur sur les clics de souris (MouseListener), mais ça détecte
> tous les clics de souris, y compris ceux sur les liens.
>
> Est-ce clair ?
>
> Une idée pour détecter les clics de souris qui ne sont pas sur des
> hyperliens ?

Oui, si tu fais:
* Point du click -> position dans le document



JTextComponent.viewToModel semble faire ça.


* puis tu récupère le style (les attributs) à la position



Comment faire ça ? getText ne renvoie que le texte et je ne trouve pas
de méthode renvoyant des informations sur le formatage du texte...

* tu regarde s'il n'y a pas un attribut qui définit le lien hypertexte

sinon, tu reparse le document complètement et tu regarde si la
position ne tombe pas dans un Element avec un style "lien hypertexte".



Si je pouvais éviter ça, ce serait bien :) .



> Merci



Avatar
Yliur
Le Mon, 28 Dec 2009 09:52:04 +0100
Albert a écrit :

Le 20/12/2009 22:07, Yliur a écrit :

>> * puis tu récupère le style (les attributs) à la position
>
> Comment faire ça ? getText ne renvoie que le texte et je ne trouve
> pas de méthode renvoyant des informations sur le formatage du
> texte...

* getDocument() te retourne un HTMLDocument
* sur ce document, getCharacterElement(int) ou
getParagraphElement(int pos) retourne un Element sur lequel tu
appelle getAttributes()
* ou sur le document, getLogicalStyle(int) ?



getCharacterElement renvoie un ensemble d'attributs dans lequel il y a
un attribut nommé "a" quand le caractère fait partie d'un lien. Je
devrais m'en sortir avec ça.

Par contre getLogicalStyle(int) m'a renvoyé null.

Le code permettant d'afficher les attributs :

// Détection du clic sur un paragraphe
public void mouseClicked (MouseEvent evt)
{
JEditorPane navig = (JEditorPane) evt.getSource() ;
HTMLDocument document = (HTMLDocument) navig.getDocument() ;
Point posClic = new Point (evt.getX(), evt.getY()) ;
int posDoc = navig.viewToModel (posClic) ;
Element eltCaractere = document.getCharacterElement (posDoc) ;
AttributeSet attrs = eltCaractere.getAttributes() ;
Enumeration nomsAttrs = attrs.getAttributeNames() ;
while (nomsAttrs.hasMoreElements())
{
Object nomAttr = nomsAttrs.nextElement() ;
System.out.println (nomAttr + " : " + attrs.getAttribute (nomAt tr)) ;
}
}

Merci pour ton aide :)