Files
mini-chat/src/ui/FenetreClient.java
T

167 lines
4.6 KiB
Java

/*
* FenetreClient.java, 06/12/2022
* INU Champollion, 2022-2023
* pas de copyright, aucun droits
*/
package ui;
import client.Client;
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;
import java.util.Objects;
/**
* Interface du client
*
* @author Gaël Burguès
* @author Laurian Dufrechou
* @author Lucàs Vabre
*/
public class FenetreClient extends JFrame {
private JTextField addressInput, portInput, pseudoInput, messageInput;
private JButton connexionButton, envoyerButton, deconnexionButton;
private JPanel mainPanel;
private JTextArea chatArea;
private JScrollPane scrollPane;
/**
* Le client lié à cette fenêtre
*/
private Client client;
/**
* Crée une nouvelle fenêtre client
*/
public FenetreClient() {
super("Fenêtre client");
add(mainPanel);
// Configure le tchat
chatArea.setEnabled(false);
chatArea.setLineWrap(true);
chatArea.setDisabledTextColor(Color.BLACK);
// Au lancement, on ne peut pas envoyer de message sans être connecté au serveur
messageInput.setEnabled(false);
envoyerButton.setEnabled(false);
// Action des boutons
messageInput.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_ENTER) envoyerMessage();
}
});
connexionButton.addActionListener(e -> connexion());
envoyerButton.addActionListener(e -> envoyerMessage());
deconnexionButton.addActionListener(e -> deconnexion());
// Quand on clique sur fermer la fenêtre, on ferme la connexion.
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
deconnexion();
}
});
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(400, 250);
this.setVisible(true);
}
/**
* Récupère la saisie de l'utilisateur et l'envoie au serveur
*/
private void envoyerMessage() {
{
String message = this.messageInput.getText();
try {
if (Objects.equals(message, "bye")) deconnexion();
else this.client.sendMessage(message);
this.messageInput.setText("");
} catch (IOException ex) {
throw new RuntimeException(ex);
}
}
}
/**
* Crée un client et le connecte au serveur à partir de l'IP et port du serveur avec le pseudo du client.
*/
public void connexion() {
String address = addressInput.getText();
int port = Integer.parseInt(portInput.getText());
String pseudo = pseudoInput.getText();
if (Objects.equals(pseudo.strip(), "")) {
new FenetreErreur("Pseudo vide !", this);
this.pseudoInput.setText("");
return;
}
this.client = new Client(address, port, pseudo, this);
this.client.start();
// Désactive le formulaire de connexion
addressInput.setEnabled(false);
portInput.setEnabled(false);
pseudoInput.setEnabled(false);
// Active l'interface de tchat
messageInput.setEnabled(true);
envoyerButton.setEnabled(true);
}
/**
* Déconnecte le client du serveur
*/
public void deconnexion() {
if (client == null) return;
// Déconnecte le client
this.client.addMessage("bye");
this.client = null;
// Vide le tchat
this.chatArea.setText("");
// Active le formulaire de connexion
addressInput.setEnabled(true);
portInput.setEnabled(true);
pseudoInput.setEnabled(true);
// Désactive l'interface de tchat
messageInput.setEnabled(false);
envoyerButton.setEnabled(false);
}
/**
* Affiche un nouveau message dans la fenêtre de tchat
* @param message message à afficher dans le tchat
*/
public void displayNewMessage(String message) {
// Ajoute le message dans l'interface de tchat
chatArea.append(String.format("%s\n", message));
// Va en bas de la fenêtre
JScrollBar vertical = scrollPane.getVerticalScrollBar();
vertical.setValue(vertical.getMaximum());
}
/**
* Lance une nouvelle fenêtre de client
* @param args non utilisé
*/
public static void main(String[] args) {
new FenetreClient();
}
}