Document/EditorKit/View : DESS SWING needed

Document/EditorKit/View : DESS SWING needed - Java - Programmation

Marsh Posté le 28-12-2003 à 13:49:51    

Voilou, je fais un petit client IRC dont le but est de regarder un peu l'architecture des composants texte en swing. Il semble que j'aie levé un gros lièvre vu 1) le nombre de classes en jeu 2) le peu de doc disponible.
 
J'ai donc un ensemble de questions auxquelles mon psy refuse de répondre en argant qu'un psy n'est pas là pour juger.
 
1) est-ce bien ce système (qui utilise en frontal un JEditorPane ou un JTextPane) dont j'ai besoin pour l'affichage des discutions IRC ou est-ce que c'est trop gros (car il ne faut pas oublier qu'il y a toute la gestion du clavier, du Caret, de undo/redo etc.).
 
2) si oui, ai-je intérêt à développer mon propre trio document/editorKit/view (qui sera tout petit mais peut-être un petit peu plus propre que ma bidouille actuelle sur DefaulStyledDocument). Quelqu'un a-t'il une doc là-dessus, et sur les critères pour faire son choix ?
 
3) sinon, qu'est-ce qu'il y a d'intéressant come composant pour faire ce que je veux (sachant qu'il me faut la sélection du texte pour le copier-coller, un peu de "pretty-printing" et la possibilité de faire des hyperliens.
 
4) Qui a une bonne doc sur tout le binz ? car le tutorial swing, c'est la grande muette sur ce sujet.
 
 
voilou voilou, si quelqu'un pouvait m'aider, ça serait cool.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 28-12-2003 à 13:49:51   

Reply

Marsh Posté le 28-12-2003 à 13:51:38    

Bon bah je reviens dans 3 ans alors [:neowen]

Reply

Marsh Posté le 28-12-2003 à 13:54:29    

merde, j'aurais dû marquer : "ingenieur grandes ecoles exigé" ça aurait été plus proche de la réalité. Les DESS, tout le monde a compris que c'était bidon.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 28-12-2003 à 14:19:47    

[:rofl2]
 
Bon on va essayer d'établir une discussion sur ce sujet auquel je m'intéresse beaucoup mais sur lequel, je n'ai malheureusement pas les connaissances qu'il faudrait.
 
Pouf pouf.
 
A supposer que tu veuilles utiliser un composant de la famille JTextArea, JEditorPane, JTextPane, il me semble en effet que le JEditorPane est le plus adapté. Je ne t'apprends rien.
 
Pour ton client IRC, tu ne peux pas te contenter d'un composant aussi uniforme que le JTextArea. Ceci te laisse finalement avec un maigre choix, d'autant que JTextPane hérite de JEditorPane, tout deux trop évolués pour tes besoins. Autant prendre le plus simple. Tu laisseras de côté ce qui ne t'intéresse pas, comme le undo/redo. Mieux vaut utiliser un JEditorPane que rentrer dans la complexité de l'architecture Swing, avec laquelle tu risques de te battre longtemps, pour obtenir ce qu'on pourrait appeler un JEditorPane épuré. ça n'en vaut pas le coup, AMHA.
 
C'est quoi ta bidouille sur le DefaultStyleDocument, pose un bout de code, le cas échéant.
 
JEditorPane me semble résolument être la réponse.
 
Tu as chez JavaSoft la Swing Connection riche de quelques articles complémentaires. http://java.sun.com/products/jfc/tsc/ mais je suppose que tu connaissais déjà.
 
Sinon, quelques bouquin que je ne conseille pas, les ayant acheté : Core Swing Advanced Programming, surtout autour du JTextField, et Graphic Java 2, Mastering the JFC, plus généraliste.


---------------
Le site de ma maman
Reply

Marsh Posté le 28-12-2003 à 14:39:44    

cherrytree a écrit :

Tu laisseras de côté ce qui ne t'intéresse pas, comme le undo/redo. Mieux vaut utiliser un JEditorPane que rentrer dans la complexité de l'architecture Swing, avec laquelle tu risques de te battre longtemps, pour obtenir ce qu'on pourrait appeler un JEditorPane épuré. ça n'en vaut pas le coup, AMHA.
 
C'est quoi ta bidouille sur le DefaultStyleDocument, pose un bout de code, le cas échéant.

1) comment on vire ce dont on n'a pas besoin ? je n'ai même pas de liste de ce qui fonctionne par défaut, mais dont je n'ai pas besoin.
2) J'ai bien envie de rentrer dans l'architecture swing j'ai que ça à foutre, et il doit bien avoir des trucs intéressants.
3) accroche-toi à ton slip :

Code :
  1. class LinkListener extends MouseAdapter implements MouseMotionListener {
  2.  public void mouseClicked(MouseEvent e) {
  3.   int pos =
  4.    textArea.getUI().viewToModel(
  5.     textArea,
  6.     new Point(e.getX(), e.getY()));
  7.   Element element = document.getCharacterElement(pos);
  8.   AttributeSet att = element.getAttributes();
  9.   if (att
  10.    .getAttribute(StyleConstants.NameAttribute)
  11.    .equals("nick" )) {
  12.    Element nickElement = element;
  13.    try {
  14.     int start = nickElement.getStartOffset();
  15.     int lenght = nickElement.getEndOffset() - start;
  16.     inputField.getDocument().insertString(
  17.      inputField.getCaretPosition(),
  18.      document.getText(start, lenght),
  19.      null);
  20.    } catch (BadLocationException ble) {
  21.     throw new RuntimeException(ble);
  22.    }
  23.   }
  24.  }
  25.  public void mouseMoved(MouseEvent e) {
  26.   int pos =
  27.    textArea.getUI().viewToModel(
  28.     textArea,
  29.     new Point(e.getX(), e.getY()));
  30.   Element element = document.getCharacterElement(pos);
  31.   AttributeSet att = element.getAttributes();
  32.   if (att.getAttribute(StyleConstants.NameAttribute).equals("nick" ))
  33.    textArea.setCursor(MoveCursor);
  34.   else
  35.    textArea.setCursor(DefaultCursor);
  36.  }
  37.  /**
  38.   * @see java.awt.event.MouseMotionListener#mouseDragged(java.awt.event.MouseEvent)
  39.   */
  40.  public void mouseDragged(MouseEvent e) {
  41.   // TODO Auto-generated method stub
  42.  }
  43. }


Hop, détection des hyperliens en allant voir le nom du style appliqué au texte. Mais c'était temporaire (sisi, je jure que c'était pour tester).
 
à propos, quelqu'un sait pourquoi la même fonctionnalité dans le javax.swing.text.html.HTMLEditorKit (lignes 632 et 726 de HTMLEditorKit.java) est beaucoup plus complexe (avec des histoires de biais) ?


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 28-12-2003 à 14:47:01    

Chu loin d'être une brute en Swing, mais t'as pensé à regarder le code des éditeurs de texte Open Source en Java comme JEdit ou Jext ? Y a tout ce qui est gestion de caret, undo/redo, etc... maintenant, pour les hyperlinks, j'crois pas qu'il y ait grand-chose :/ (auquel cas va falloir que tu te fasses le composant à l'ancienne, comme chez grand-mère :o)


---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
Reply

Marsh Posté le 28-12-2003 à 14:51:19    

Taiche a écrit :

Chu loin d'être une brute en Swing, mais t'as pensé à regarder le code des éditeurs de texte Open Source en Java comme JEdit ou Jext

Hum, faire un éditeur, tout le monde sait faire. C'est faire un paediteur qui m'intéresse.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 28-12-2003 à 14:56:53    

J'entends bien, mais y a une fenêtre de texte avec gestion de ce que tu demandes (sauf hyperlinks) : ça pourrait p'têt te donner des pistes [:spamafote]


---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
Reply

Marsh Posté le 28-12-2003 à 14:59:30    

ouais, t'as raison, de toutes façon, ça coûte rien de jetter un oeuil, y'a probablement pas grand'chose sur ce point là mais il doit y avoir a manger quand même sur d'autres trucs.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 28-12-2003 à 15:20:16    

1) En fait tout est activé par défaut, parce que le trio Document, EditorKit et View émet des suppositions sur ce que tu recherches. Le DefaultEditorKit que tu utilises supporte la notion de Content-Type, dont tu te fiches. Tu ne peux pas la supprimer, à moins de repartir de zéro (cette notion existe aussi dans EditorKit) : JComponent et tes interfaces personnelles. A toi de voir si cela vaut le coup. Tu peux aussi t'abstenir de t'occuper de ce genre de détails, accepter que ton composant est trop, par rapport à ce que tu veux, et ne pas utiliser ce qui ne sert pas.
 
2) C'est difficile, mal documenté, je trouve, mais ça peut rapporter gros.
 
3) Ouais, ce me semble un poil capillotracté pour ce que tu veux faire, encore que. Juste pour être sûr que je comprends bien ton snippet, inputField, c'est bien un JTextField dans lequel l'utilisateur tape son message ?
 
Peux-tu me décrire un peu ce que tu attends de ton UI ?


---------------
Le site de ma maman
Reply

Marsh Posté le 28-12-2003 à 15:20:16   

Reply

Marsh Posté le 28-12-2003 à 15:32:20    

cherrytree a écrit :

1) En fait tout est activé par défaut, parce que le trio Document, EditorKit et View émet des suppositions sur ce que tu recherches. Le DefaultEditorKit que tu utilises supporte la notion de Content-Type, dont tu te fiches. Tu ne peux pas la supprimer, à moins de repartir de zéro (cette notion existe aussi dans EditorKit) : JComponent et tes interfaces personnelles. A toi de voir si cela vaut le coup. Tu peux aussi t'abstenir de t'occuper de ce genre de détails, accepter que ton composant est trop, par rapport à ce que tu veux, et ne pas utiliser ce qui ne sert pas.
 
2) C'est difficile, mal documenté, je trouve, mais ça peut rapporter gros.
 
3) Ouais, ce me semble un poil capillotracté pour ce que tu veux faire, encore que. Juste pour être sûr que je comprends bien ton snippet, inputField, c'est bien un JTextField dans lequel l'utilisateur tape son message ?
 
Peux-tu me décrire un peu ce que tu attends de ton UI ?

1) si je fais un EditorKit, je vais lui mettre un truc style x-application/njchat et l'enregistrer comme ça, ça ne me dérange pas.
 
3) oui, on clique sur un nick (qui est bleu et souligné dans le fenêtre) et ça le copie à la fin du JTextField. La partie caca est bien entendu :

Code :
  1. if (att
  2.    .getAttribute(StyleConstants.NameAttribute)
  3.    .equals("nick" )) { ... }


 
 
Ce que je veux : un composant qui affiche du texte, avec "wrapping" sur les mots, styles (couleurs, typo, soulignement), la possibilité pour l'utilisateur de sélectionner du texte et de le copier. Prendre un minimum de mémoire. Qui supporte le texte cliquable. Qui prenne un minimum de mémoire. Et puisqu'on en est aux rêves qui ne soit pas buggé sous Mac OS X.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 28-12-2003 à 15:57:27    

Tout ça, le JEditorPane le fait, mais il fait plus aussi. Quant aux bugs, je te laisse seul juge.


---------------
Le site de ma maman
Reply

Marsh Posté le 28-12-2003 à 16:25:11    

je crois que vous vous casseez la tete pour rien :o
 
jeditorpane supporte deja les liens hyperText:
 
jeditorpane.addHyperlinkListener(new Hyperactive());  
 

Code :
  1. class Hyperactive implements HyperlinkListener {
  2.          public void hyperlinkUpdate(HyperlinkEvent e) {
  3.            if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
  4.         JEditorPane pane = (JEditorPane) e.getSource();
  5.         if (e instanceof HTMLFrameHyperlinkEvent) {
  6.             HTMLFrameHyperlinkEvent  evt = (HTMLFrameHyperlinkEvent)e;
  7.             HTMLDocument doc = (HTMLDocument)pane.getDocument();
  8.             doc.processHTMLFrameHyperlinkEvent(evt);
  9.         } else {
  10.             taFonctionQuiOuvreUnNavigateur(e.getURL());
  11.         }
  12.            }
  13.        }
  14.      }


 
 
sinon pour le reste 2 possibilités:
 

Sinon tu peux tres facilement coloré tout et n'importe quoi.
tu vera, tres vite tout deviendras plus clair ;)
 
++


Message édité par veryfree le 28-12-2003 à 16:26:54
Reply

Marsh Posté le 30-12-2003 à 13:13:26    

J'ai trouvé une méthode un peu mieux :

Code :
  1. static public String CLICKEABLE = "clickeable";
  2. nickStyle.addAttribute(CLICKEABLE, Boolean.TRUE);


on donne Boolean.TRUE ou Boolean.False pour tous les types de l'application (par exemple en mettant cette propriété à false dans le type par défaut, et à true pour tous ceux où c'est nécessaire) puis après, par exemple :

Code :
  1. public void mouseMoved(MouseEvent e) {
  2.   int pos =
  3.    textArea.getUI().viewToModel(
  4.     textArea,
  5.     new Point(e.getX(), e.getY()));
  6.   Element element = document.getCharacterElement(pos);
  7.   AttributeSet att = element.getAttributes();
  8.   Boolean clickeable = (Boolean)att.getAttribute(CLICKEABLE);
  9.   assert clickeable != null;
  10.   if (clickeable.booleanValue())
  11.    textArea.setCursor(MoveCursor);
  12.   else
  13.    textArea.setCursor(DefaultCursor);
  14.  }


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 30-12-2003 à 13:32:19    

Habile.


---------------
Le site de ma maman
Reply

Marsh Posté le 30-12-2003 à 14:21:04    

et stocker le actionListener de la même manière ?
 
(attention, c'est un piège)


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 30-12-2003 à 14:29:01    

nraynaud a écrit :


(attention, c'est un piège)


Pourquoi ça ?


---------------
Le site de ma maman
Reply

Marsh Posté le 30-12-2003 à 14:38:09    

cherrytree a écrit :

Pourquoi ça ?

Clickeable, ça veut dire qu'on peut faire click, mais mettre le actionListener dedans, ça veut dire créer un style par actionListener, on change donc d'ordre dans la complexité en nombre de styles.
 
(dans mon cas, je pense que je vais le faire quand même)


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 30-12-2003 à 14:46:53    

Du coup tu ne pourrais plus stocker ta prop en Boolean.


---------------
Le site de ma maman
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed