Coloring incoming messages in Java Chat-implmentation
Categories:
Coloring Incoming Messages in Java Chat Applications

Learn how to enhance user experience in your Java chat application by implementing distinct color schemes for incoming messages, making conversations more readable and engaging.
In a chat application, visual cues play a crucial role in user experience. Differentiating between incoming and outgoing messages at a glance significantly improves readability and user comprehension. This article will guide you through implementing a system to color incoming messages in a Java-based chat application, focusing on common UI frameworks like Swing or JavaFX, and the underlying logic for message handling.
Understanding Message Flow and UI Components
Before diving into code, it's essential to understand how messages typically flow in a chat application and which UI components are best suited for displaying rich, colored text. A typical chat client receives messages from a server, which then need to be rendered in a text area or a similar display component. For coloring, we need components that support styled text, such as JTextPane
or JEditorPane
in Swing, or TextFlow
and Text
nodes in JavaFX.
sequenceDiagram participant ClientA participant Server participant ClientB ClientA->>Server: Sends "Hello!" Server->>ClientB: Forwards "Hello!" (from ClientA) ClientB->>ClientB: Renders "Hello!" in specific color (incoming) ClientB->>Server: Sends "Hi there!" Server->>ClientA: Forwards "Hi there!" (from ClientB) ClientA->>ClientA: Renders "Hi there!" in specific color (incoming)
Sequence diagram of message flow and rendering in a chat application
Implementing Colored Messages with Swing's JTextPane
For Swing applications, JTextPane
is an excellent choice as it allows for rich text formatting using StyledDocument
and Style
. You can define different styles (e.g., for incoming, outgoing, system messages) and apply them to specific text segments. This approach provides fine-grained control over fonts, colors, and other text attributes.
import javax.swing.*;
import javax.swing.text.*;
import java.awt.*;
public class ChatDisplay extends JFrame {
private JTextPane chatPane;
private StyledDocument doc;
public ChatDisplay() {
super("Colored Chat Example");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(400, 300);
chatPane = new JTextPane();
chatPane.setEditable(false);
JScrollPane scrollPane = new JScrollPane(chatPane);
add(scrollPane, BorderLayout.CENTER);
doc = chatPane.getStyledDocument();
// Define styles
Style defaultStyle = chatPane.addStyle("Default", null);
StyleConstants.setFontFamily(defaultStyle, "SansSerif");
StyleConstants.setFontSize(defaultStyle, 12);
Style incomingStyle = chatPane.addStyle("Incoming", defaultStyle);
StyleConstants.setForeground(incomingStyle, Color.BLUE);
Style outgoingStyle = chatPane.addStyle("Outgoing", defaultStyle);
StyleConstants.setForeground(outgoingStyle, Color.BLACK);
// Example messages
appendMessage("Alice", "Hello Bob!", true);
appendMessage("Bob", "Hi Alice! How are you?", false);
appendMessage("Alice", "I'm good, thanks!", true);
setVisible(true);
}
public void appendMessage(String sender, String message, boolean isIncoming) {
try {
Style style = isIncoming ? doc.getStyle("Incoming") : doc.getStyle("Outgoing");
doc.insertString(doc.getLength(), sender + ": ", doc.getStyle("Default"));
doc.insertString(doc.getLength(), message + "\n", style);
} catch (BadLocationException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(ChatDisplay::new);
}
}
Handling Messages in JavaFX
For JavaFX applications, TextFlow
is a powerful layout pane that can arrange multiple Text
nodes. Each Text
node can have its own styling, making it ideal for displaying colored chat messages. You can define CSS styles or apply styles programmatically to Text
objects.
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.ScrollPane;
import javafx.scene.layout.VBox;
import javafx.scene.text.Text;
import javafx.scene.text.TextFlow;
import javafx.stage.Stage;
public class JavaFXChatDisplay extends Application {
private VBox messageContainer;
@Override
public void start(Stage primaryStage) {
messageContainer = new VBox(5);
messageContainer.setStyle("-fx-padding: 10;");
ScrollPane scrollPane = new ScrollPane(messageContainer);
scrollPane.setFitToWidth(true);
scrollPane.setVbarPolicy(ScrollPane.ScrollBarPolicy.AS_NEEDED);
// Example messages
appendMessage("Alice", "Hello Bob!", true);
appendMessage("Bob", "Hi Alice! How are you?", false);
appendMessage("Alice", "I'm good, thanks!", true);
Scene scene = new Scene(scrollPane, 400, 300);
scene.getStylesheets().add(getClass().getResource("chat.css").toExternalForm());
primaryStage.setTitle("Colored JavaFX Chat");
primaryStage.setScene(scene);
primaryStage.show();
}
public void appendMessage(String sender, String message, boolean isIncoming) {
Text senderText = new Text(sender + ": ");
senderText.getStyleClass().add("sender-name");
Text messageText = new Text(message);
if (isIncoming) {
messageText.getStyleClass().add("incoming-message");
} else {
messageText.getStyleClass().add("outgoing-message");
}
TextFlow textFlow = new TextFlow(senderText, messageText, new Text("\n"));
messageContainer.getChildren().add(textFlow);
}
public static void main(String[] args) {
launch(args);
}
}
.sender-name {
-fx-font-weight: bold;
}
.incoming-message {
-fx-fill: blue;
}
.outgoing-message {
-fx-fill: black;
}
1. Define Message Structure
Create a Message
class that includes properties like sender
, content
, and isIncoming
(a boolean flag to indicate if the message is from another user).
2. Choose UI Component
Select an appropriate UI component for displaying rich text (e.g., JTextPane
for Swing, TextFlow
for JavaFX).
3. Define Styles
Create distinct styles for incoming and outgoing messages. This could be Style
objects in Swing or CSS classes in JavaFX.
4. Implement Message Appending Logic
Write a method that takes a Message
object, applies the correct style based on its isIncoming
flag, and appends it to your display component.
5. Integrate with Chat Logic
When your chat client receives a message from the server, parse it, determine if it's incoming, and then call your message appending method.