2016-01-03 4 views
0

J'ai un simple système de chat client-serveur que je veux coder en couleur afin que les messages du client et les messages du serveur soient affichés dans différentes couleurs. Je donne les résultats suivants:Comment créer des chats codés en couleur entre le client et le serveur à l'aide de JTextPane?

 try { 
      String messageout=""; 
      messageout=jTextField1.getText(); 
      jTextField1.setText(""); 

     appendToPane(jTextPane1,"\n"+"client: "+messageout,Color.BLUE); 
     dos.writeUTF(messageout); 
    } catch (IOException ex) { 
     Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex); 
    } 

dos est le flux de sortie de données

et:

private void appendToPane(JTextPane tp, String msg, Color c) 
{ 
    StyleContext sc = StyleContext.getDefaultStyleContext(); 
    AttributeSet aset = sc.addAttribute(SimpleAttributeSet.EMPTY, StyleConstants.Foreground, c); 

    aset = sc.addAttribute(aset, StyleConstants.FontFamily, "Lucida Console"); 
    aset = sc.addAttribute(aset, StyleConstants.Alignment, StyleConstants.ALIGN_JUSTIFIED); 

    int len =tp.getDocument().getLength(); 
    tp.setCaretPosition(len); 
    tp.setCharacterAttributes(aset, false); 
    tp.replaceSelection(msg); 
    tp.setText(tp.getText()+msg); 

}

Le serveur a le code simlar qui définit la couleur au vert plutôt que bleu . Le problème est que je veux que les messages clients soient affichés en bleu et que les messages du serveur soient affichés en vert, alors que pour le moment, tous les messages sont affichés en bleu dans le client et tous les messages sont affichés en vert . Je veux ce qui suit: 'client: blaablaa (en bleu)' 'serveur: blaablaa (en vert)'

Quelqu'un peut-il aider?

EDIT: lecture client du serveur (couleur enlevé jusqu'à ce que je trouve une solution réelle)

 s=new Socket("localhost",1000); 
     dis=new DataInputStream(s.getInputStream()); 
     dos=new DataOutputStream(s.getOutputStream()); 
     while(!msgin.equals("bye")){ 
      msgin=dis.readUTF(); 
      jTextPane1.setText(jTextPane1.getText()+"\n"+"server:"+msgin); 

Je veux ajouter un contexte de couleur à la dernière ligne de code.

Edition - en utilisant appendToPane plutôt que setText (rien affiché, lorsque je retire la dernière setText de appendToPane.

ss = new ServerSocket(1000); 
    s = ss.accept(); 
    dis=new DataInputStream(s.getInputStream()); 
    dos=new DataOutputStream(s.getOutputStream()); 
    while(!msgin.equals("bye")){ 
     msgin=dis.readUTF(); 
     appendToPane(jTextPane1,"\n"+"client: "+msgin,Color.RED); 

ET:

 String messageout=""; 
     messageout=jTextField1.getText(); 


    jTextField1.setText(""); 
    appendToPane(jTextPane1,"\n"+"server:"+messageout,Color.BLUE); 
    //jTextPane1.setText(jTextPane1.getText()+"\n"+"server:"+messageout); 
     dos.writeUTF(messageout); 
+0

Passez la couleur avec le message? –

+0

Où est la partie où vous ajoutez les messages du serveur à 'JTextPane' de votre client? – RealSkeptic

+0

@RealSkeptic. Code ajouté. Couleur enlevée jusqu'à ce que je trouve une solution. Gilbert Le Blanc - c'est exactement la question. Comment puis-je ajouter de la couleur aux messages provenant du serveur/client? –

Répondre

1

Si votre TextPane est réglé pour être non modifiable (par exemple, vous avez un tp.setEditable(false) quelque part, vous ne pouvez pas utiliser les opérations qui le modifier. La méthode replaceSelection() est une méthode d'édition, et donc, au lieu de faire quoi que ce soit, juste émet un signal sonore.

alors vous avez choisi de remplacer le texte intégral du volet texte, qui n'est pas considéré comme une méthode d'édition. Mais alors, vous perdez le style.

au lieu de faire non plus, dans un non modifiable Dans le volet de texte, vous devez ajouter au document qui sauvegarde le volet de texte. Par exemple, changez votre appendToPane comme ceci:

private static void appendToPane(JTextPane tp, String msg, Color c) 
{ 
    StyleContext sc = StyleContext.getDefaultStyleContext(); 
    AttributeSet aset = sc.addAttribute(SimpleAttributeSet.EMPTY, StyleConstants.Foreground, c); 

    aset = sc.addAttribute(aset, StyleConstants.FontFamily, "Lucida Console"); 
    aset = sc.addAttribute(aset, StyleConstants.Alignment, StyleConstants.ALIGN_JUSTIFIED); 

    // Get the TextPane's Document 
    Document doc = tp.getDocument(); 
    int len = doc.getLength(); 
    try { 
     doc.insertString(len, msg, aset); // Use the `insertString` method of the document. 
    } catch (BadLocationException e) { 
     // Nothing. Using the doc length makes sure this exception isn't thrown 
    } 

} 
+0

Je ne suis plus sceptique de vous;). Merci beaucoup! –

-1

Vous pouvez embed basic HTML avec vos composants Swing

b1 = new JButton("<html><center><b><u>D</u>isable</b><br>" 
       + "<font color=#ffffdd>middle button</font>", 
       leftButtonIcon); 
Font font = b1.getFont().deriveFont(Font.PLAIN); 
b1.setFont(font); 
... 
b2 = new JButton("middle button", middleButtonIcon); 
b2.setFont(font); 
b2.setForeground(new Color(0xffffdd)); 
... 
b3 = new JButton("<html><center><b><u>E</u>nable</b><br>" 
       + "<font color=#ffffdd>middle button</font>", 
       rightButtonIcon); 
b3.setFont(font); 

Code du th La page liée

+0

Je ne veux pas ajouter du HTML à un bouton ou un composant lui-même. Je veux l'ajouter dans le texte dans un composant –