Create an Advanced Chat Box in Java

The following example illustrates creating an advanced chat box in Java in Swing that detects whether the user is thinking or typing and displays the message accordingly. This chat box is just for demo purpose and it doesn't use any of the networking concepts to interact with the second person.
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.event.*;
class Chatbox extends JFrame
{
JPanel jp;
JTextField jt;
JTextArea ta;
JLabel l;
boolean typing;
Timer t;

    public Chatbox()
    {
        createAndShowGUI();
    }
   
    private void createAndShowGUI()
    {
   
        // Set frame properties
        setTitle("Chatbox");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
       
        // Create a JPanel and set layout
        jp=new JPanel();
        jp.setLayout(new GridLayout(2,1));
        l=new JLabel();
        jp.add(l);
       
        // Create a timer that executes every 1 millisecond
        t=new Timer(1,new ActionListener(){
            public void actionPerformed(ActionEvent ae)
            {
                // If the user isn't typing, he is thinking
                if(!typing)
                l.setText("Thinking..");
            }
        });
       
        // Set initial delay of 2000 ms
        // That means, actionPerformed() is executed 2500ms
        // after the start() is called
        t.setInitialDelay(2000);
       
        // Create JTextField, add it.
        jt=new JTextField();
        jp.add(jt);
       
       
        // Add panel to the south,
        add(jp,BorderLayout.SOUTH);
       
       
        // Add a KeyListener
        jt.addKeyListener(new KeyAdapter(){
            public void keyPressed(KeyEvent ke)
            {
           
                // Key pressed means, the user is typing
                l.setText("You are typing..");
               
                // When key is pressed, stop the timer
                // so that the user is not thinking, he is typing
                t.stop();
               
                // He is typing, the key is pressed
                typing=true;
               
                // If he presses enter, add text to chat textarea
                if(ke.getKeyCode()==KeyEvent.VK_ENTER) showLabel(jt.getText());
            }
           
            public void keyReleased(KeyEvent ke)
            {
           
                // When the user isn't typing..
                typing=false;
               
                // If the timer is not running, i.e.
                // when the user is not thinking..
                if(!t.isRunning())
               
                // He released a key, start the timer,
                // the timer is started after 2500ms, it sees
                // whether the user is still in the keyReleased state
                // which means, he is thinking
                t.start();
            }
        });
       
        // Create a textarea
        ta=new JTextArea();
               
        // Make it non-editable
        ta.setEditable(false);
       
        // Set some margin, for the text
        ta.setMargin(new Insets(7,7,7,7));
       
        // Set a scrollpane
        JScrollPane js=new JScrollPane(ta);
        add(js);
       
        addWindowListener(new WindowAdapter(){
            public void windowOpened(WindowEvent we)
            {
                // Get the focus when window is opened
                jt.requestFocus();
            }
        });
       
        setSize(400,400);
        setLocationRelativeTo(null);
        setVisible(true);
    }
   
    private void showLabel(String text)
    {
        // If text is empty return
        if(text.trim().isEmpty()) return;
       
        // Otherwise, append text with a new line
        ta.append(text+"\n");
       
        // Set textfield and label text to empty string
        jt.setText("");
        l.setText("");
    }
   
    public static void main(String args[])
    {
        SwingUtilities.invokeLater(new Runnable(){
            public void run()
            {
                new Chatbox();
            }
        });
    }
}

Chat box screenshot

No comments: