2012-03-28 11 views
0

Aus der obigen Frage habe ich eine einfache Windows-App ähnlich MSN und Yahoo Messenger gemacht. Wenn ein Benutzer eine Nachricht und die Schaltfläche „Senden“ trifft, fügt der Code unter dem Namen des Benutzers und Nachricht an die das Textfeld:Java-Swing: Ist es möglich, die Farbe einer bestimmten String-Variable zu ändern?

textArea_ChatLog.append(chatName + "\n" + " " + msgChat + "\n"); 

, die in diesem Format angezeigt werden würde:

Username 
Message the user typed. 

Ist Gibt es eine Lösung zum Ändern der Farbe von "ChatName?" Die einzige Information, die ich gefunden habe, betrifft das Ändern der Farbe von ganzen Komponenten (was ich nicht will).

+7

Strings wollte nicht haben Farben. Du fragst nach UI. – SLaks

+2

@SLaks Deshalb habe ich "Java Swing:" gestellt und gefragt, ob es "möglich" ist. – SpicyWeenie

Antwort

5

Sie können HTML-Tags verwenden und mit Swing-Komponenten formatieren. Werfen Sie einen Blick auf dieses Tutorial - How to Use HTML in Swing Components.

+0

Ich überprüfte es, aber nichts in Bezug auf Aussehen zu einzelnen String-Variablen wie meins zu ändern. Meine String-Namen können nicht hart codiert werden, da sie mit dem Namen verknüpft sind, unter dem ich mich anmelde. – SpicyWeenie

1

Scheint wie das, was Sie verwenden sollten JTextPane/JEditorPane ist, für Farben zufällig Zeichenfolgenliteralen ändern, versuchen Sie Ihre Hände auf diesem Code scheint, wie das ist, was Sie :-)

import java.awt.*; 

import java.awt.event.*; 

import javax.swing.*; 

import javax.swing.border.*; 

import javax.swing.text.AttributeSet; 
import javax.swing.text.SimpleAttributeSet; 
import javax.swing.text.StyleConstants; 
import javax.swing.text.StyleContext; 

public class TextPaneTest extends JFrame 
{ 
    private JPanel topPanel; 
    private JTextPane tPane; 
    private JTextField tfield; 
    private String username = null; 

    public TextPaneTest() 
    { 
     topPanel = new JPanel(); 
     topPanel.setLayout(new BorderLayout(5, 5)); 

     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setLocationRelativeTo(null);    

     EmptyBorder eb = new EmptyBorder(new Insets(10, 10, 10, 10)); 

     tPane = new JTextPane();     
     tPane.setBorder(eb); 
     //tPane.setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY)); 
     tPane.setMargin(new Insets(5, 5, 5, 5)); 
     JScrollPane scrollPane = new JScrollPane(tPane); 

     topPanel.add(scrollPane, BorderLayout.CENTER); 

     tfield = new JTextField(10); 
     tfield.addActionListener(new ActionListener() 
     { 
      public void actionPerformed(ActionEvent ae) 
      { 
       if (tfield.getDocument().getLength() > 0) 
       { 
        appendToPane(tPane, username + " : ", Color.MAGENTA); 
        appendToPane(tPane, tfield.getText() + "\n", Color.DARK_GRAY); 
        tfield.selectAll(); 
       } 
      } 
     });  
     topPanel.add(tfield, BorderLayout.PAGE_END);   

     getContentPane().add(topPanel);  

     setSize(200, 100); 
     setVisible(true);   

     while (username == null) 
     { 
      username = JOptionPane.showInputDialog(null, "Please Enter USERNAME : "); 
     } 
     tfield.requestFocusInWindow(); 
    } 

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

    public static void main(String... args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
      { 
       public void run() 
       { 
        new TextPaneTest(); 
       } 
      }); 
    } 
} 
+0

vielleicht der richtige Weg, +1 – mKorbel

+0

Hehe, danke, ich hoffe auch so :-) –

Verwandte Themen