JEditorPane, clics, hyperliens

Le
Yliur
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 ?

Merci
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Albert
Le #20792411
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


Yliur
Le #20807871
Le Fri, 18 Dec 2009 09:44:34 +0100
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



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



Yliur
Le #21001181
Le Mon, 28 Dec 2009 09:52:04 +0100
Albert
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 :)
Publicité
Poster une réponse
Anonyme