Summaries

University notes in Markdown format from Obsidian.

Chat con Swing

download Download MD

Come realizzare una chat come la seguente?

Per quanto riguarda il file ChatFrame.java:

package chat;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.BoxLayout;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTextArea;

public class ChatFrame extends JFrame {
    private static final long serialVersionUID = 4213060829881951932L;

    public void createWindow() {
        JPanel left = createLeftPanel(); JPanel right = createRightPanel();
        JScrollPane leftScroll = new JScrollPane(left);
        JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, leftScroll, right);
        splitPane.setDividerSize(10); splitPane.setDividerLocation(200);
        this.add(splitPane); this.setTitle("Chat"); this.setSize(800, 500);
        this.setMinimumSize(new Dimension(400, 400));
        this.setVisible(true);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public JPanel createLeftPanel() {
        JPanel left = new JPanel();
        left.setLayout(new BoxLayout(left, BoxLayout.PAGE_AXIS));
        Contact c1 = new Contact(new ImageIcon(getClass().getResource("/resources/img1.png")), "Mario Rossi");
        Contact c2 = new Contact(new ImageIcon(getClass().getResource("/resources/img2.png")), "Maria Bianchi");
        Contact c3 = new Contact(new ImageIcon(getClass().getResource("/resources/img3.png")), "Francesco Verdi");
        Contact c4 = new Contact(new ImageIcon(getClass().getResource("/resources/img4.png")), "Simona Gialli");
        left.add(c1); left.add(c2); left.add(c3); left.add(c4);
        return left;
    }

    private void handleMessage(JTextArea message, JTextArea allMessages) {
        String msg = message.getText();
        allMessages.append(msg + System.lineSeparator());
        message.setText("");
    }

    public JPanel createRightPanel() {
        JPanel right = new JPanel();
        right.setLayout(new BorderLayout());
        JTextArea allMessages = new JTextArea();
        allMessages.setEditable(false);
        JScrollPane scrollAllMessages = new JScrollPane(allMessages);
        right.add(scrollAllMessages, BorderLayout.CENTER);

        JPanel south = new JPanel();
        south.setLayout(new BoxLayout(south, BoxLayout.LINE_AXIS));
        JTextArea message = new JTextArea();
        message.setLineWrap(true);
        JScrollPane scrollMessages = new JScrollPane(message);
        JButton send = new JButton("Send");
        south.setPreferredSize(new Dimension(550, 100));
        south.add(scrollMessages);
        south.add(send);

        send.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                handleMessage(message, allMessages);
            }
        });

        message.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                if(e.getKeyCode() == KeyEvent.VK_ENTER) {
                    if(!e.isShiftDown()) {
                        handleMessage(message, allMessages);
                        e.consume();
                    }
                    else {
                        message.append(System.lineSeparator());
                    }
                }
            }
        });

        right.add(south, BorderLayout.SOUTH);
        return right;
    }

    public static void main(String[] args) {
        ChatFrame f = new ChatFrame();
        f.createWindow();
    }
}

Per quanto riguarda il file Contact.java:

package chat;

import java.awt.Image;
import javax.swing.ImageIcon;
import javax.swing.JLabel;

public class Contact extends JLabel {
    private static final long serialVersionUID = 228236008666904772L;

    public Contact(ImageIcon img, String text) {
        Image picture = img.getImage().getScaledInstance(50, 50, Image.SCALE_SMOOTH);
        this.setIcon(new ImageIcon(picture));
        this.setText(text);
    }
}