Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    Disegno in java - Disegnare linee in stile matita del paint

    Salve a tutti ho già postato un problema simile, credevo di riuscire a risolvere da solo ma non è stato così, quindi ritento con qualche anima pia sul forum:

    vi spiego la situazione, devo inserire un pannello all'interno del pannello principale di un frame più grande dove sia possibile disegnare in stile matita del paint (il pannello serve per inserire una ipotetica firma da parte di un cliente) ho creato il pannello che realizza il disegno ma mi da un problemino, praticamente quando trascino il mouse per disegnare le linee(la firma) il pannello si riempie con elementi del pannello che lo contiene, non so se sono stato chiaro.

    Ho letto molta documentazione sul disegno in java ma non sono riuscito a capire dove intervenire, posto l'ultima versione del codice:

    codice:
    import javax.swing.*;
    import java.awt.*;
    import java.awt.Color.*;
    import java.awt.event.*;
    
    
    public class PaintPannello extends javax.swing.JPanel {
    
      private int startXPoint = 0;  // coordinata x di partenza
      private int endXPoint = 0;    // coordinata x di arrivo
      private int startYPoint = 0;  // coordinata y di partenza
      private int endYPoint = 0;    // coordinata y di arrivo
      private boolean paint = false;
    
      // ascoltatore del moto del mouse
      class mMotionListener implements MouseMotionListener {
        public void mouseDragged(MouseEvent e) {
          // aggiorna le coordinate
          startXPoint = endXPoint;
          startYPoint = endYPoint;
          endXPoint = e.getX();
          endYPoint = e.getY();
          // disegna
          PaintPannello.this.repaint();
        }
        public void mouseMoved(MouseEvent e) {
          // aggiorna le coordinate
          startXPoint = endXPoint;
          startYPoint = endYPoint;
          endXPoint = e.getX();
          endYPoint = e.getY();
        }
      }
      // ascoltatore dei pulsanti del mouse
      class mListener implements MouseListener {
        // i seguenti metodi sono richiesti dalla
        // interfaccia MouseListener anche se non
        // vengono utilizzati
        public void mouseClicked(MouseEvent e) {}
        public void mouseEntered(MouseEvent e) {}
        public void mouseExited(MouseEvent e)  {}
    
        // pulsante premuto
        public void mousePressed(MouseEvent e) {
          // attiva la modalita' di disegno
          paint = true;
        }
        // pulsante rilasciato
        public void mouseReleased(MouseEvent e) {
          // disattiva la modalita' di disegno
          paint = false;
        }
      }
      // Costruttore della classe principale
      public PaintPannello() {
        initComponents();
        this.setSize(374,152);
        MouseListener ml = new mListener();
        addMouseListener(ml);
        MouseMotionListener mml = new mMotionListener();
        addMouseMotionListener(mml);
      }
      public void paint(Graphics g) {
        // se e' attiva la modalita' di disegno, traccia una riga
        if(paint)
          g.drawLine(startXPoint,startYPoint,endXPoint,endYPoint); 
      }
    Questo era il pannello dove disegno, e questo che segue è il codice con il quale includo il pannello in quello principale

    codice:
            PaintPannello paint = new PaintPannello();
            paint.setVisible(true);
            pannelloContenitorePaint.add(paint);
            pannelloContenitorePaint.setVisible(true);
            this.validate();
    Grazie anticipatamente per l'aiuto ciao a tutti

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Disegno in java - Disegnare linee in stile matita del paint

    Originariamente inviato da mharck87
    codice:
      public void paint(Graphics g) {
        // se e' attiva la modalita' di disegno, traccia una riga
        if(paint)
          g.drawLine(startXPoint,startYPoint,endXPoint,endYPoint); 
      }
    Due cose che si possono dedurre facilmente e pure (molto) velocemente:
    1) Nei componenti Swing il "contesto" di disegno appropriato è protected void paintComponent(Graphics) non il paint(Graphics). Il paint esiste ovviamente ancora perché è l'entry-point principale ma si dovrebbe fare l'override di paint solo se si sa davvero che cosa si sta facendo (e per motivi validi).

    2) Dal codice si evince che disegni solo 1 riga, quindi solo l'ultima resta persistente e oltretutto solo finché quella variabile paint è true. Detto in altre parole, se vuoi disegnare più righe e cose e che siano "persistenti", non è questo l'approccio appropriato.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    le linee che disegno rimangono visualizzate, non rimane solo l'ultima che ho disegnato comunque quel paint era un ultimo disperato tentativo prima usavo paint component, ho capito che l'approccio è sbagliato ma perchè ci va a finire dentro cose che non hanno nulla a che vedere con il pannello e con il disegno.

    comunque avresti qualche consiglio, oltre al fatto di cambiare approccio ? ciao e grazie

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da mharck87
    le linee che disegno rimangono visualizzate
    No che non sono "persistenti" (non nel senso che dovrebbe essere). Ridimensiona il frame o iconizzalo e ripristinalo e vedrai che una bella smorfia si "disegnerà" sul tuo viso ....
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    a si in questo senso... si avevo notato questo piccolo particolare, suggerimenti ? pillole ? qualcosa da segnalare ?

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da mharck87
    suggerimenti ? pillole ? qualcosa da segnalare ?
    Quello che posso consigliarti è:

    - ridefinisci ovviamente paintComponent, non paint.

    - specialmente se poi quello che viene disegnato deve essere successivamente manipolato o salvato (su file es. in png o jpeg) o stampato da qualche parte, una soluzione è quella di tenere una immagine di buffer off-screen su cui fare i disegni e nel paintComponent si disegna banalmente questa immagine.
    Ogni volta che aggiorni la immagine di buffer, chiedi anche un repaint del pannello che quindi aggiornerà anche a video il risultato del disegno. Poi ci possono essere le varie ottimizzazioni, come ad esempio chiedere il repaint solo dell'area effettivamente modificata (cioè non si usa il repaint() senza argomenti ma un'altra delle versioni di repaint).

    - se il PaintPannello lo inserisci in un contenitore che ha un layout manager e specialmente se dove lo metti viene rispettata la sua dimensione "preferita" (o se lo metti in un JScrollPane ma non è il tuo caso come deduco dal codice), allora sarebbe anche bene dargli una dimensione "preferita" (setPreferredSize, non setSize).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    grazie sono riuscito a risolvere con la tecnica della bufferedImage sbirciando un po' da un tuo java example nella sezione graphics

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.