2010-01-30 3 views
5

Je développe un éditeur RTF WYSIWYG simple en Java et j'ai un petit problème. Je dois être en mesure de synchroniser les boutons bascule de sélection de style (tels que gras, italique, souligné) à la sélection de texte des utilisateurs. Par exemple, si la sélection de texte en cours est claire, les boutons en gras, en italique et soulignés ne sont pas sélectionnés, mais lorsque l'utilisateur sélectionne du texte en gras et souligné, les boutons en gras et soulignés sont sélectionnés.JTextPane Synchroniser l'interface de sélection de style Problème

Maintenant, je suis assez sûr que JTextPane.getInputAttributes() me donne les attributs de sélection que je veux, mais il y a un problème avec l'écoute des événements de mise à jour de caret. Le problème est que l'écouteur caret attaché au JTextPane semble s'appeler APRÈS la modification de l'attribut d'entrée. Donc, la sélection est toujours un pas en arrière. Autrement dit, je dois sélectionner le texte deux fois avant que les boutons à bascule soient mis à jour!

Le code important est ici:

textPane.addCaretListener(new CaretListener() { 

     @Override 
     public void caretUpdate(CaretEvent e) { 
      syncAttributesWithUI(textPane.getInputAttributes()); 
     } 
    }); 

Et:

private void syncAttributesWithUI(AttributeSet attributes) { 
    boldButton.setSelected(StyleConstants.isBold(attributes)); 
    italicButton.setSelected(StyleConstants.isItalic(attributes)); 
    underlineButton.setSelected(StyleConstants.isUnderline(attributes)); 
} 

Merci à l'avance!

+0

Avez-vous répondu à votre question? Si non, pensez à poster un SSCCE –

Répondre

1

Le CaretListener écoute votre textPane, mais les attributs existants pour la sélection sont dans votre Document. Vous pouvez utiliser les méthodes CaretEvent pour trouver la partie sélectionnée du Document et conditionner vos boutons en fonction des styles qui s'y trouvent. Malheureusement, la sélection peut être incohérente, par ex. partie en gras et partie en italique. Une pratique courante consiste à supposer que l'utilisateur souhaite appliquer un nouvel ensemble d'attributs à l'ensemble de la sélection.

+0

La méthode que vous suggérez est en fait ce que je faisais à l'origine. J'obtiendrais chaque élément de caractère individuel de la sélection et trouverais l'intersection d'ensemble d'attributs pour déterminer ce que l'interface utilisateur devrait refléter. Mais alors j'ai réalisé que 1) La méthode getInputAttributes() semble déjà le faire et 2) Ma méthode ne peut pas déterminer quel style est appliqué si le curseur est déplacé à la dernière position du document jusqu'à ce que l'utilisateur ait déclenché une entrée. Bien sûr, je peux probablement déterminer cela en travaillant sur le style de caractère à (position de fin - 1), mais j'espérais qu'il y aurait une façon plus propre :( – S73417H

+0

Je m'attendrais à ce que l'utilisateur veuille les attributs retournés par 'getInputAttributes() 'rester inchangé quand le signe est à la fin. – trashgod

0

Vous pouvez essayer de reporter la synchronisation, de sorte que les autres changements qui pourraient se produire d'abord:

@Override 
public void caretUpdate(CaretEvent e) { 
    SwingUtilities.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      syncAttributesWithUI(textPane.getInputAttributes()); 
     } 
    }); 
} 

(Avertissement: Deviner du haut de ma tête - je ne pas écrire en fait un test pour confirmer