Partage
  • Partager sur Facebook
  • Partager sur Twitter

Dessiner avec la souris en java

Anonyme
    30 avril 2021 à 14:55:17

    Bonjour a tous !

    Je viens vers vous aujourd'hui car j'ai un petit soucis sur mon programme, je cherche a créer une fenêtre ou on pourrai dessiner comme le tp d'ardoise magique présent sur ce site.

    Bien entendu je ne peut pas faire comme le tp vu que j'ai déjà implémenter tout un system de rendu d'image, ce grâce a un grand renfort de tuto et de forum sur la toile.

    Je vous présente le code :

    Voici ma class Display qui gère tout l'affichage :

    package Core.Graphics;
    
    import java.awt.Canvas;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.image.BufferStrategy;
    
    import javax.swing.JFrame;
    
    import Utils.KeyHandler;
    import Utils.MouseHandler;
    
    public class Display extends Canvas implements Runnable {
    
    	/*** Attributs ***/
    	
    	private static final long serialVersionUID = 1L;
    
    	private Thread thread;
    	private JFrame frame;
    	public static final int WIDTH = 800;
    	public static final int HEIGHT = 600;
    	private static boolean running = false;
    	
    	private KeyHandler key;
    	private MouseHandler mouse;
    	int mousex = 0, mousey = 0;
    	
    	/*** Constructeurs ***/
    	
    	public Display() {
    		this.frame = new JFrame();
    		
    		Dimension size = new Dimension(WIDTH, HEIGHT);
    		this.setPreferredSize(size);
    	}
    	
    	/*** Getters et Setters ***/
    	
    	public JFrame getFrame() { return frame; }
    	
    	/*** Methodes ***/
    	
    	public synchronized void start() {
    		running = true;
    		this.thread = new Thread(this, "Display");
    		this.thread.start();
    	}
    	
    	public synchronized void stop() {
    		running = false;
    		try {
    			this.thread.join();
    		} catch (InterruptedException e) {
    			e.printStackTrace();
    		}
    	}
    	
    	@Override
    	public void run() {
    		long lastTime = System.nanoTime();
    		long timer = System.currentTimeMillis();
    		final double ns = 1000000000.0 / 60;
    		double delta = 0;
    		int frames = 0;
    		this.key = new KeyHandler(this);
    		this.mouse = new MouseHandler(this);
    		
    		while(running) {
    			long now = System.nanoTime();
    			delta += (now - lastTime) / ns;
    			lastTime = now;
    			
    			while(delta >= 1) {
    				update();
    				input(key, mouse);
    				delta --;
    			}
    			input(key,mouse);
    			render();
    			frames ++;
    			
    			if(System.currentTimeMillis() - timer > 1000) {
    				timer += 1000;
    				this.frame.setTitle("The Project | " + frames + " fps");
    				frames = 0;
    			}
    		}
    		
    		stop();
    	}
    	
    	private void update() {
    		
    	}
    	
    	private void input(KeyHandler key, MouseHandler mouse) {
    		
    	}
    
    	private void render() {
    		BufferStrategy bs = this.getBufferStrategy();
    		if(bs == null) {
    			this.createBufferStrategy(3);
    			return;
    		}
    		
    		Graphics g = bs.getDrawGraphics();
    		
    		g.setColor(Color.WHITE);
    		g.fillRect(0, 0, WIDTH * 2, HEIGHT * 2);
    		
    		Drawing(g);
    		
    		g.dispose();
    		bs.show();
    	}
    	
    	private void Drawing(Graphics g) {
    		
    		if(mousex == 0 || mousey == 0) {
    			mousex = mouse.getX();
    			mousey = mouse.getY();
    			System.out.println("plop");
    		}else {
    			g.setColor(Color.BLACK);
    			g.drawLine(mousex, mousey, mouse.getX(), mouse.getY());
    			System.out.println("plop2");
    		}
    		
    	}
    }
    

    Et je vous presente la class de la gestion de la souris :

    package Utils;
    
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import java.awt.event.MouseMotionListener;
    
    import Core.Graphics.Display;
    
    public class MouseHandler implements MouseListener, MouseMotionListener{
    
    	/*** Attributs ***/
    	
    	private static int mouseX = -1;
    	private static int mouseY = -1;
    	private static int mouseB = -1;
    	
    	/*** Constructeurs ***/
    	
    	public MouseHandler(Display Window) {
    		Window.addMouseListener(this);
    		Window.addMouseMotionListener(this);
    	}
    	
    	/*** Getters et Setters ***/
    	
    	public int getX() { return mouseX; }
    	public int getY() { return mouseY; }
    	public int getButton() { return mouseB; }
    	
    	/*** Methodes ***/
    	
    	@Override
    	public void mouseDragged(MouseEvent e) {
    		mouseX = e.getX();
    		mouseY = e.getY();
    	}
    
    	@Override
    	public void mouseMoved(MouseEvent e) {
    	}
    
    	@Override
    	public void mouseClicked(MouseEvent e) {
    		mouseX = e.getX();
    		mouseY = e.getY();
    	}
    
    	@Override
    	public void mouseEntered(MouseEvent e) {
    		
    	}
    
    	@Override
    	public void mouseExited(MouseEvent e) {
    		
    	}
    
    	@Override
    	public void mousePressed(MouseEvent e) {
    		mouseB = e.getButton();
    	}
    
    	@Override
    	public void mouseReleased(MouseEvent e) {
    		mouseB = -1;
    	}
    }
    

    Voila.

    Pour l'instant j'arrive a créer une ligne (une seule) lorsque je drag la souris et la ligne ce fixe lors du drop. Voici donc mes problèmes :

    Pour commencer lorsque je clic pour créer une seconde ligne la première disparait.

    Ensuite le point de départ de ma ligne n'est pas au coordonnée du premier clic mais l'origine de la fenêtre soit (0,0).

    J'aimerai aussi vous prévenir que j'ai des lacunes sur la gestion du 2D donc si il y a mauvaise question de méthodes, pouvez vous m'explique le pourquoi et ce qu'il faudrait faire pour corriger ca.

    Merci d'avance pour votre temps !



    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      9 mai 2021 à 22:48:58

      up ! personne ?
      • Partager sur Facebook
      • Partager sur Twitter

      Dessiner avec la souris en java

      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
      • Editeur
      • Markdown