Dessiner dans une fenêtre JFrame

Signaler
Messages postés
6
Date d'inscription
samedi 14 mars 2015
Statut
Membre
Dernière intervention
15 février 2018
-
Messages postés
5363
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
30 avril 2021
-
Salut les zéros, j'essaie de faire une petite appli qui permet de dessiner avec la souris dans un fenêtre JFrame. En essayant de faire ca, j'ai deux souci que je trouve bizarre et que j'arrive pas à resoudre!

De un, j'ai un décalage entre l'endroit ou je presse le bouton de la souris et l'endroit ou je vois le trait que je veux tracer apparaître (étrange n'est ce pas!!?)

De deux, dans ma JFrame j'ai deux JPanel, un pour dessiner au centre et l'autre au nord, comme gestionnaire de positionnement j'utilise un borderlayout, donc mon jpanel dans lequel je veux dessiner est centré mais j'arrive pas à ne pas sortir les trace de ma souris qui deborde toujours en suivant mes mouvements sur toute la fenêtre. Svp aidez moi please je cale net sur ça! Voici mon code :


private int x1, int y1;
private JPanel milieu = new JPanel();

private JMenuBar jmb = new JMenuBar();
private JMenu affichage = new JMenu("Affichage");
private JMenu aide = new JMenu("Aide?");
private JMenu couleur = new JMenu("Couleur");
private JMenu forme = new JMenu("Forme");

private JMenuItem carre = new JMenuItem("Carré");
private JMenuItem rond = new JMenuItem("Rond");
private JMenuItem effacer = new JMenuItem("Effacer");
private JMenuItem texteAide = new JMenuItem("Texte d'aide");
private JMenuItem boiteAide = new JMenuItem("Fenêtre d'aide");
private JMenuItem rouge = new JMenuItem("rouge");
private JMenuItem bleu = new JMenuItem("bleu");
private JMenuItem vert = new JMenuItem("vert");
private JMenuItem jaune = new JMenuItem("jaune");
private JMenuItem gris = new JMenuItem("gris");
private JMenuItem orange = new JMenuItem("orange");
private JMenuItem violet = new JMenuItem("violet");
private JMenuItem noir = new JMenuItem("noir");
private JMenuItem blanc = new JMenuItem("blanc");

private JToolBar barreOutil = new JToolBar();
private JButton boutonRouge = new JButton("");
private JButton boutonBleu = new JButton("");
private JButton boutonVert = new JButton("");
private JButton boutonJaune = new JButton("");
private JButton boutonGris = new JButton("");
private JButton boutonOrange = new JButton("");
private JButton boutonViolet = new JButton("");
private JButton boutonNoir = new JButton("");
private JButton boutonBlanc = new JButton("");
protected Fenetre()
{
this.setTitle("Boite à dessin");
this.setSize(430, 430);
this.setLocationRelativeTo(null);
this.setResizable(false);
this.setLayout(new BorderLayout(1,1));

milieu.setBackground(new Color(194,211,231));
this.add(milieu, BorderLayout.CENTER);

affichage.add(couleur);affichage.add(effacer);affichage.add(forme);forme.add(carre);forme.add(rond);
couleur.add(blanc);couleur.add(gris);couleur.add(jaune);couleur.add(vert);couleur.add(bleu);couleur.add(rouge);
couleur.add(orange);couleur.add(violet);couleur.add(noir);
aide.add(texteAide);aide.add(boiteAide);
jmb.add(affichage);jmb.add(aide);jmb.setBackground(Color.yellow);
this.setJMenuBar(jmb);

boutonRouge.setBackground(Color.red);boutonBleu.setBackground(Color.blue);boutonVert.setBackground(Color.green);boutonGris.setBackground(Color.gray);
boutonBlanc.setBackground(Color.white);boutonNoir.setBackground(Color.black);boutonViolet.setBackground(new Color(163,73,164));boutonOrange.setBackground(Color.orange);
boutonJaune.setBackground(Color.yellow);

barreOutil.add(boutonRouge);barreOutil.add(boutonBleu);barreOutil.add(boutonGris);barreOutil.add(boutonOrange);
barreOutil.add(boutonBlanc);barreOutil.add(boutonVert);barreOutil.add(boutonViolet);barreOutil.add(boutonNoir);
barreOutil.add(boutonJaune);
barreOutil.setOrientation(JToolBar.HORIZONTAL);
barreOutil.setFloatable(false);
barreOutil.setPreferredSize(new Dimension(400,18));
this.add(barreOutil, BorderLayout.NORTH);

rond.addActionListener(this);vert.addActionListener(this);jaune.addActionListener(this);blanc.addActionListener(this);carre.addActionListener(this);
effacer.addActionListener(this);bleu.addActionListener(this);gris.addActionListener(this);noir.addActionListener(this);orange.addActionListener(this);
texteAide.addActionListener(this);rouge.addActionListener(this);orange.addActionListener(this);violet.addActionListener(this);

boutonRouge.addActionListener(this);boutonJaune.addActionListener(this);boutonOrange.addActionListener(this);boutonViolet.addActionListener(this);
boutonBleu.addActionListener(this);boutonVert.addActionListener(this);boutonGris.addActionListener(this);boutonNoir.addActionListener(this);

//this.addMouseListener(this);
milieu.addMouseListener(this);
milieu.addMouseMotionListener(this);
}

protected void showWindow()
{
this.setVisible(true);
}

@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
int x1 = e.getX();
int y1 = e.getY();
}

@Override
public void mouseReleased(MouseEvent arg0) {
// TODO Auto-generated method stub

}
@Override
public void mouseDragged(MouseEvent e) {
// TODO Auto-generated method stub
Graphics g = getGraphics( );
int xFin = e.getX( );
int yFin = e.getY( );
g.drawLine(x1, y1, xFin, yFin);;
}

@Override
public void mouseMoved(MouseEvent arg0) {
// TODO Auto-generated method stub

}

@Override
public void mouseClicked(MouseEvent arg0) {
// TODO Auto-generated method stub
}

@Override
public void mouseEntered(MouseEvent arg0) {
// TODO Auto-generated method stub
}

@Override
public void mouseExited(MouseEvent arg0) {
// TODO Auto-generated method stub
}

@Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub

}



EDIT: Ajout de la coloration syntaxique et suppression de "5000" puces présentes avant le code.

1 réponse

Messages postés
5363
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
30 avril 2021
108
Salut,

Avant de commencer tu dessines dans la fenêtre et non dans ton panel du centre... de plus tu as placé tes listeners de souris dans la fenêtre du coup la position x/y du curseur est relative à la fenêtre et non ton panel.

Ci-dessous un exemple de dessin avec la mouse:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Fenetre extends JFrame implements ActionListener {
  private WhiteBoard        whiteBoard       = null;

  protected Fenetre() {
    setTitle("Boite à dessin");
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setSize(430, 430);
    setLocationRelativeTo(null);
    // setLayout(new BorderLayout(1, 1)); // Implicite, Le contentPane d'une
    // JFrame est déjà en BorderLayout

    final JButton btClear = new JButton("Clear");
    btClear.addActionListener(this);
    final JPanel pnorth = new JPanel();
    pnorth.add(btClear);
    getContentPane().add(pnorth, BorderLayout.NORTH);

    whiteBoard = new WhiteBoard();
    getContentPane().add(whiteBoard, BorderLayout.CENTER);
  }

  public static void main(final String[] args) {
    new Fenetre().setVisible(true);
  }

  @Override
  public void actionPerformed(final ActionEvent e) {
    whiteBoard.clear();
  }

  private class WhiteBoard extends JPanel implements MouseListener,
      MouseMotionListener {
    private Point             curr            = null;
    private Point             prev            = null;


    public WhiteBoard() {
      addMouseListener(this);
      addMouseMotionListener(this);
      setOpaque(true);;
    }

    public void clear() {
      getGraphics().clearRect(0, 0, getWidth(), getHeight());
    }

    @Override
    public void mouseDragged(final MouseEvent e) {
      prev=curr;
      curr=e.getPoint();
      final Graphics g = getGraphics();
      g.setColor(Color.RED);
      g.drawLine(prev.x,prev.y,curr.x,curr.y);
    }

    @Override
    public void mouseMoved(final MouseEvent e) { }

    @Override
    public void mouseClicked(final MouseEvent e) { }

    @Override
    public void mouseEntered(final MouseEvent e) { }

    @Override
    public void mouseExited(final MouseEvent e) { }

    @Override
    public void mousePressed(final MouseEvent e) {
      curr = e.getPoint();
    }

    @Override
    public void mouseReleased(final MouseEvent e) {
      prev=curr=null;
    }
  }

}