2016-01-03 2 views
0

У меня есть простая чат-система клиент-сервер, в которой я хочу, чтобы код цвета, чтобы сообщения от клиента и сообщения, отображаемые сервером, отображались в разных цветах. У меня есть следующие:Как сделать цветные чаты между клиентом и сервером с помощью 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); 
    } 

дос является выходной поток данных

и:

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); 

}

Сервер имеет simlar код, который задает цвет на зеленый, а не синий , Проблема в том, что я хочу, чтобы сообщения клиента отображались синим цветом, а сообщения сервера отображались зеленым цветом, тогда как в настоящий момент на клиенте все сообщения отображаются синим цветом, а на сервере все сообщения отображаются зеленым цветом , Я хочу следующее: 'client: blaablaa (in blue)' 'server: blaablaa (in green)'

Помочь ли кто-нибудь?

EDIT: Клиент чтения с сервера (цвет удаляется, пока я не нашел реальное решение)

 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); 

Я хочу, чтобы добавить контекст цвета в последней строке кода.

РЕДАКТИРОВАТЬ - с использованием appendToPane, а не SetText (ничего не отображается, когда я удалить последний SetText из 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); 

И:

 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

Передайте цвет с сообщением? –

+0

Где вы добавляете сообщения сервера в 'JTextPane' вашего клиента? – RealSkeptic

+0

@RealSkeptic. Добавлен код. Цвет удаляется до тех пор, пока я не найду решение. Гилберт Ле Блан - вот и вопрос. Как добавить цвет к сообщениям, поступающим с сервера/клиента –

ответ

1

Если ваш TextPane установлен быть не доступны для редактирования (например, у вас есть tp.setEditable(false) где-то, то вы не можете использовать операции, редактировать его. Метод replaceSelection() представляет собой способ редактирования, и, таким образом, вместо того, чтобы делать что-либо, это просто пищу.

Итак, вы решили заменить весь текст текстовой панели, которая не рассматривается метод редактирования. Но потом, вы теряете стиль.

Вместо того чтобы делать либо, в нередактируемом текстовое поле, вы должны добавить к документу, который поддерживает текстовую панель. Так, например, измените свой appendToPane следующим образом:

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

Я больше не скептически отношусь к вам;). Спасибо! –

-1

Вы можете embed basic HTML с компонентами 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); 

Код, снятый с производства связанная страница.

+0

Я не хочу добавлять HTML к кнопке или компоненту сам. Я хочу добавить его в текст внутри компонента –