2016-05-22 3 views
0

Avec le code ci-dessous, j'essaie d'aligner et de colorier les messages en fonction de l'expéditeur. Mais il applique la couleur immédiatement mais il n'applique pas l'alignement immédiatement comme l'image.Java JTextPane StyleConstants L'alignement ne fonctionne pas correctement

Les bleues proviennent de l'expéditeur et doivent être à gauche, les rouges à d'autres expéditeurs, doivent être à droite, orange à partir du serveur, doivent être centrés.

enter image description here

public void showMessage(String name, String message) { 

    StyledDocument doc = txt_showMessage.getStyledDocument(); 

    SimpleAttributeSet left = new SimpleAttributeSet(); 
    StyleConstants.setAlignment(left, StyleConstants.ALIGN_LEFT); 
    StyleConstants.setForeground(left, Color.RED); 
    StyleConstants.setFontSize(left, 14); 

    SimpleAttributeSet right = new SimpleAttributeSet(); 
    StyleConstants.setAlignment(right, StyleConstants.ALIGN_RIGHT); 
    StyleConstants.setForeground(right, Color.BLUE); 
    StyleConstants.setFontSize(right, 14); 

    SimpleAttributeSet center = new SimpleAttributeSet(); 
    StyleConstants.setAlignment(center, StyleConstants.ALIGN_CENTER); 
    StyleConstants.setForeground(center, Color.ORANGE); 

    try { 
     if (c.getServerName().equals(name)) { 
      doc.insertString(doc.getLength(), new SimpleDateFormat("HH:mm").format(new Date()) + " " + name + ": " + message + "\n", center); 
      doc.setParagraphAttributes(doc.getLength(), 1, center, false); 
     } else if (c.getName().equals(name)) //if message is from same client 
     { 
      doc.insertString(doc.getLength(), new SimpleDateFormat("HH:mm").format(new Date()) + " " + name + ": " + message + "\n", right); 
      doc.setParagraphAttributes(doc.getLength(), 1, right, false); 

     } else {  //if message is from another client 
      doc.insertString(doc.getLength(), new SimpleDateFormat("HH:mm").format(new Date()) + " " + name + ": " + message + "\n", left); 
      doc.setParagraphAttributes(doc.getLength(), 1, left, false); 
     } 
    } catch (BadLocationException e) { 
     System.out.println("Cannot write message"); 
    } 
} 
+1

Pourriez-vous essayer avec: 'doc.setParagraphAttributes (Math.max (0, doc.getLength() - 1), 1, XXX, false); au lieu ? Si cela fonctionne, je vais vous expliquer pourquoi. – Sharcoux

Répondre

2

Vous appelez setParagraphAttributes() pour le dernier paragraphe que (doc.getLength() et size = 1). Au lieu de cela un message de magasin offset de démarrage et d'appliquer les attributs de paragraphe au texte inséré

int offset = doc.getLength(); 
String message = new SimpleDateFormat("HH:mm").format(new Date()) + " " + name + ": " + message + "\n" 

doc.insertString(doc.getLength(), message, center); 
doc.setParagraphAttributes(offset, message.length() , center, false); 
+0

Celui-ci fonctionne aussi, merci beaucoup – Ilkin

1

Appel setParagraphAttributes le dernier caractère + 1: doc.setParagraphAttributes(doc.getLength(), 1... appliquera le style sur l'entrée suivante, ce qui signifie qu'au lieu de dire votre document « s'il vous plaît, mettez le dernier paragraphe à droite ", vous demandez plutôt" s'il vous plaît, mettez le prochain paragraphe à droite ". C'est pourquoi vous pensez qu'il y a un "retard" avant que votre demande ne soit appliquée.