From 1444eee35e32a3248890105f25fad182f07f7490 Mon Sep 17 00:00:00 2001 From: sid Date: Thu, 19 Sep 2024 12:12:09 +0200 Subject: [PATCH] dessin final --- src/main/java/beans/Drawing.java | 110 +++++++++++++++++-------------- 1 file changed, 60 insertions(+), 50 deletions(-) diff --git a/src/main/java/beans/Drawing.java b/src/main/java/beans/Drawing.java index f296347..ab4a24b 100644 --- a/src/main/java/beans/Drawing.java +++ b/src/main/java/beans/Drawing.java @@ -1,62 +1,63 @@ package beans; - +import javax.imageio.ImageIO; import javax.swing.*; import java.awt.*; import java.awt.event.*; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; public class Drawing extends JFrame { private Color currentColor = Color.BLACK; private int brushSize = 10; private boolean eraserMode = false; + private boolean hasDrawn = false; // Indicateur pour savoir si un dessin a été effectué + private DrawArea drawArea; + private JButton saveButton; // Bouton pour enregistrer public Drawing() { setTitle("Application de Dessin"); setSize(800, 600); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - // Zone de dessin drawArea = new DrawArea(); drawArea.setBackground(Color.WHITE); - // Bouton pour choisir la couleur + // Créer les boutons et options (sans icônes ni curseur personnalisé) JButton colorButton = new JButton("Couleur"); - colorButton.setFocusable(false); colorButton.addActionListener(e -> chooseColor()); - // Bouton pour effacer tout JButton eraseButton = new JButton("Effacer tout"); - eraseButton.setFocusable(false); - eraseButton.addActionListener(e -> drawArea.clear()); + eraseButton.addActionListener(e -> { + drawArea.clear(); + hasDrawn = false; // Réinitialiser le statut + saveButton.setEnabled(false); // Désactiver le bouton d'enregistrement + }); - // Slider pour choisir la taille du pinceau JSlider sizeSlider = new JSlider(1, 50, brushSize); sizeSlider.setMajorTickSpacing(10); sizeSlider.setPaintTicks(true); sizeSlider.setPaintLabels(true); - sizeSlider.addChangeListener(new ChangeListener() { - @Override - public void stateChanged(ChangeEvent e) { - brushSize = sizeSlider.getValue(); - } - }); + sizeSlider.addChangeListener(e -> brushSize = sizeSlider.getValue()); - // Bouton pour activer/désactiver la gomme JButton eraserButton = new JButton("Gomme"); - eraserButton.setFocusable(false); eraserButton.addActionListener(e -> eraserMode = !eraserMode); - // Disposition des éléments d'interface dans un JPanel avec un FlowLayout + // Bouton "Enregistrer" désactivé par défaut + saveButton = new JButton("Enregistrer"); + saveButton.setEnabled(false); // Désactivé par défaut + saveButton.addActionListener(e -> saveDrawing()); + + // Disposition des éléments d'interface JPanel controls = new JPanel(); - controls.setLayout(new FlowLayout(FlowLayout.LEFT, 10, 10)); // Espacement entre les composants controls.add(colorButton); - controls.add(new JLabel("Taille du pinceau :")); + controls.add(new JLabel("Taille du stylo :")); controls.add(sizeSlider); controls.add(eraserButton); controls.add(eraseButton); + controls.add(saveButton); // Ajout du bouton d'enregistrement // Ajouter les composants à la fenêtre add(controls, BorderLayout.NORTH); @@ -74,10 +75,33 @@ public class Drawing extends JFrame { } } - // Zone de dessin personnalisée - private class DrawArea extends JPanel { + // Méthode pour enregistrer le dessin dans un fichier + private void saveDrawing() { + if (!hasDrawn) { + JOptionPane.showMessageDialog(this, "Rien n'a été dessiné à enregistrer.", "Erreur", JOptionPane.ERROR_MESSAGE); + return; + } + + JFileChooser fileChooser = new JFileChooser(); + fileChooser.setDialogTitle("Enregistrer le dessin"); + int userSelection = fileChooser.showSaveDialog(this); + + if (userSelection == JFileChooser.APPROVE_OPTION) { + File fileToSave = fileChooser.getSelectedFile(); + try { + // Crée un fichier PNG + ImageIO.write(drawArea.getImage(), "png", new File(fileToSave.getAbsolutePath() + ".png")); + JOptionPane.showMessageDialog(this, "Dessin enregistré avec succès !"); + } catch (IOException ex) { + ex.printStackTrace(); + JOptionPane.showMessageDialog(this, "Erreur lors de l'enregistrement du fichier.", "Erreur", JOptionPane.ERROR_MESSAGE); + } + } + } - private Image image; + // Zone de dessin + private class DrawArea extends JPanel { + private BufferedImage image; private Graphics2D g2d; private int prevX, prevY; @@ -103,45 +127,26 @@ public class Drawing extends JFrame { int y = e.getY(); if (eraserMode) { - g2d.setColor(Color.WHITE); // Utiliser la gomme + g2d.setColor(Color.WHITE); // Mode gomme } else { - g2d.setColor(currentColor); // Utiliser la couleur sélectionnée + g2d.setColor(currentColor); // Mode pinceau } - // Dessiner un trait continu g2d.setStroke(new BasicStroke(brushSize, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND)); g2d.drawLine(prevX, prevY, x, y); - repaint(); prevX = x; prevY = y; - } - }); - // Redimensionner l'image lors du redimensionnement de la fenêtre - addComponentListener(new ComponentAdapter() { - @Override - public void componentResized(ComponentEvent e) { - if (g2d != null) { - Image newImage = createImage(getWidth(), getHeight()); - Graphics2D g2dNew = (Graphics2D) newImage.getGraphics(); - g2dNew.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - g2dNew.setColor(Color.WHITE); - g2dNew.fillRect(0, 0, getWidth(), getHeight()); - g2dNew.drawImage(image, 0, 0, null); // Copie l'ancien contenu sur la nouvelle image - g2d = g2dNew; - image = newImage; - } else { - initDrawing(getSize().width, getSize().height); - } - repaint(); + hasDrawn = true; // Marque le fait qu'un dessin a été effectué + saveButton.setEnabled(true); // Active le bouton d'enregistrement } }); } - // Méthode pour initialiser l'image de dessin + // Initialisation de l'image de dessin private void initDrawing(int width, int height) { - image = createImage(width, height); + image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); g2d = (Graphics2D) image.getGraphics(); g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2d.setColor(Color.WHITE); @@ -149,7 +154,7 @@ public class Drawing extends JFrame { g2d.setColor(Color.BLACK); } - // Méthode pour effacer le dessin + // Effacer tout public void clear() { g2d.setPaint(Color.WHITE); g2d.fillRect(0, 0, getSize().width, getSize().height); @@ -157,6 +162,11 @@ public class Drawing extends JFrame { repaint(); } + // Retourne l'image en cours de dessin + public BufferedImage getImage() { + return image; + } + @Override protected void paintComponent(Graphics g) { super.paintComponent(g); -- GitLab