Table des matières

Swing

TD n°9

La priorité doit être donnée à l'implémentation des fonctionnalités du TD n°8

Idées de fonctionnalités à ajouter :

Autres idées personnelles : à faire valider par l'enseignant

Correction de Bug

Symptôme : Sélection non apparente sur création Rectangle ou Ellipse

1 ligne à supprimer dans le constructeur :

	public EcouteurSelection(MainController mainController) {
		super(mainController);
		this.clip = new Rectangle();
		borderColor = new Color(79, 129, 189);
		backgroundColor = new Color(205, 220, 237, 100);
	}

A ajouter dans le changement d'outil courant :

	@Override
	public void propertyChange(PropertyChangeEvent evt) {
	...
		case ELLIPSE_TOOL:
			changerOutil(eEllipse);
			zoneDeDessin.seteSelection(eEllipse);
			break;
	...

TD n°8

Question 1

L’application de dessin ne propose pour l'instant que 2 outils de dessin (crayon et étoile). On souhaite ajouter 2 nouveaux outils, permettant de dessiner des figures géométriques simples : Rectangle et Ellipse.

De façon à faciliter cette implémentation, 1 nouveau contrôleur a été créé : EcouteurSelection, permettant de représenter à la souris la création d'un Rectangle ou d'une Ellipse.

Question 2

L’application développée jusque là ne permet pas de choisir la couleur. On souhaite permettre à l’utilisateur de modifier les caractéristiques du pinceau avec lequel se fait le dessin an ajoutant ce choix dans la boîte de dialogue existante PenSizeAndColorDialog.

Le tutoriel de Java (http://docs.oracle.com/javase/tutorial/uiswing/components/colorchooser.html) donne la marche à suivre et fournit des exemples de choix de couleur.

TD n°7

TODO

Partie 1 : prévention de la perte potentielle du dessin effectué

Sur fermeture de la fenêtre principale, ou l'ouverture d'un Dessin, si le dessin en cours a été modifié (dirty=true dans MainController), la boîte de message suivante doit-être affichée :

  1. créer la méthode closeQuery(String message) dans MainController permettant de gérer l'enregistrement éventuel avant perte du dessin
  2. Gérer les événements pouvant provoquer une perte du dessin en créant les écouteurs nécessaires.

Partie 2 : Ajout de l'outil Épaisseur de trait

Ajouter la fonctionnalité permettant de modifier l'épaisseur du trait de dessin, accessible depuis le menu Outil :

Le comportement du dialog (essentiellement visuel) peut être implémenté directement dans la vue (sans séparation MVC) :

Structure de la classe DlgEpaisseur :

Ressources

1 - Boîtes de message :
on utilise la classe JOptionPane

public class DialogsEx {
	public static void main(String[] args) {
		JFrame maFenetre = new JFrame("JOptionPane exemples");
		UIManager.put("OptionPane.messageFont", new FontUIResource(new Font("Segoe UI", Font.PLAIN, 12)));
		UIManager.put("OptionPane.buttonFont", new FontUIResource(new Font("Segoe UI", Font.PLAIN, 12)));
		maFenetre.setBounds(50, 100, 700, 500);
		maFenetre.setResizable(true);
		maFenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		maFenetre.setVisible(true);
		JOptionPane.showMessageDialog(maFenetre, "L'enregistrement du fichier est effectué.", "Dialogue d'information", JOptionPane.INFORMATION_MESSAGE);
		JOptionPane.showMessageDialog(maFenetre, "Une erreur est survenue lors de l'enregistrement du fichier.\nVous pouvez réessayer avec un autre nom de fichier ou sur un autre support !", "Dialogue d'avertissement", JOptionPane.WARNING_MESSAGE);
		JOptionPane.showMessageDialog(maFenetre, "Une erreur est survenue et l'opération a échoué !", "Dialogue d'erreur", JOptionPane.ERROR_MESSAGE);
		if (JOptionPane.showConfirmDialog(maFenetre, "Voulez-vous poursuivre ?", "Dialogue de questionnement", JOptionPane.YES_NO_CANCEL_OPTION) == JOptionPane.YES_OPTION) {
			String prenom = JOptionPane.showInputDialog(maFenetre, "Prénom :", "Pierre");
			if (prenom != null)
				JOptionPane.showMessageDialog(maFenetre, "Bonjour " + prenom + ".", "Bonjour", JOptionPane.PLAIN_MESSAGE);
		}
	}
}
2 - Ecouteurs sur fenêtre : Pour gérer les événements liés à la fenêtre (Fermeture, désactivation…) :

TD6

TODO

Partie 1

Pour la partie 1, travailler en binômes : 1 étudiant utilise les actionListeners, 1 autre le propertyChangeListener.
Les expériences sont ensuite partagées.
Dans chaque binôme :

  1. 1 étudiant implémente les actions suivantes en utilisant des ActionListener dans la vue FenetreDeDessin dans le projet TD6-ACTL
    • changement d'outil sur menu (Etoile ou crayon)
    • Fermeture de l'application
    • Effacement du dessin
  2. 1 autre implémente ces 3 mêmes actions en utilisant PropertyChangeListener au niveau du contrôleur dans le projet TD6-PCL
  3. Comparer ensuite les 2 versions (avantages/inconvénients)

Partie 2

  1. Implémenter les actions des éléments de menu Ouvrir, Enregistrer et Enregistrer sous :
    • observer et comprendre la mise en oeuvre de la sérialisation proposée (Interface, classe DAO, classes métier)
    • utiliser l'instance dessinDao du contrôleur pour l'ouverture et la sauvegarde, et la propriété dirty (drapeau pour désigner la modification)
    • utiliser JFileChooser pour les boîtes de dialogue (voir FileDialogEx.java) voir JFileChooser javadoc
    • Gérer les exceptions

Partie 3

  1. Créer une boîte de dialogue A propos de… et ajouter un élément de menu correspondant dans un menu ?/A propos de… voir JDialog
  2. Proposer des solutions pour qu'une seule instance de DialogAbout soit créée pendant l'exécution de l'application
  3. Créer un sous menu Couleur dans Outil, proposant de changer la couleur de l'outil (noir, bleu, rouge, vert, jaune), modifier le modèle pour prendre en compte la couleur des figures.

Boîte de dialogue A propos de… :

Ressources

	String imagePathAndFileName="CheminRelatifVersImage";
	java.net.URL imageURL = getClass().getResource(imagePathAndFileName);
	img = new ImageIcon(imageURL).getImage();

	JPanel panel = new JPanel() {
		@Override
		public void paint(Graphics g) {
			//dessin sur g...
		}
	};

TD5

TODO

  1. Terminer l'implémentation Dessin Swing avec 2 outils + Contrôleur principal
  2. Ajouter le changement d'outil sur frappe touche du clavier (e → Etoile , c → Crayon ) voir addKeyListener
  3. Ajouter le changement d'outil dans un menu Outil composé de 2 JRadioButtonMenuItem, intégrés dans un ButtonGroup :

Menu Outil :

TD4

Composants

JFrame

java 7 JFrame API
Paramètres de base

Ajout de listeners :

JMenuBar

Java 7 JMenuBar API

JMenu

JMenuItem

LayoutManager

Java 7 LayoutManager API

BorderLayout

		parent.setLayout(new BorderLayout());
		parent.add(component, BorderLayout.CENTER);

GridLayout

		parent.setLayout(new GridLayout(1, 3));
		parent.add(component);