Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15

Discussione: [JAVA] Swing painter

  1. #1
    Utente di HTML.it L'avatar di userfra
    Registrato dal
    Jul 2001
    Messaggi
    1,418

    [JAVA] Swing painter

    Ciao ho provato questo codice tratto da mokabyte.it, solo che il JFrame è tutto nero, qualcuno sa dirmi il perché?
    grazie

    codice:
    import javax.swing.*; 
    import java.awt.*; 
    import java.awt.Color.*; 
    import java.awt.event.*; 
    
    public class Painter extends 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 
          Painter.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 Painter() { 
        super(); 
        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); 
      } 
     public static void main(String argv[]) { 
        Painter p = new Painter(); 
        JFrame f = new JFrame("Painter"); 
        f.getContentPane().add(p); 
        f.setSize(400,300); 
        f.setVisible(true); 
     } 
    }
    -------------------------------------------------
    Il fumo nuoce gravemente alla salute

  2. #2
    Utente di HTML.it
    Registrato dal
    Mar 2002
    Messaggi
    315
    Vedi se cosi' riesci a risolvere.

    codice:
    public void paint(Graphics g) {
      if(paint)
        g.drawLine(startXPoint, startYPoint, endXPoint, endYPoint);
      else
        super.paint(g);
    }
    Ciao,
    Lorenzo

  3. #3
    Funziona alla perfezione!!!
    Qual'è il problema?
    Blink@go

    "Non tutto quel che è oro brilla, Ne gli erranti sono perduti; Il vecchio ch'è forte non s'aggrinza, Le radici profonde non gelano.Dalle ceneri rinascerà un fuoco, L'ombra sprigionerà una scintilla, Nuova sarà la lama ormai rotta, E re quei ch'è senza corona."

    ------------
    Lang: java 1.4.1 Eclipse

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2002
    Messaggi
    1,798
    Originariamente inviato da blinkago
    Funziona alla perfezione!!!
    Qual'è il problema?
    Ciao ragazzi !!!

    Volevo solo aggiungere una cosa, oltre al fatto che il codice è perfettamente funzionante.
    Quando si ridefinisce un metodo, considerare se effettuare o meno una chiamata al metodo della superclasse (in questo caso super.paintComponent(g), onde evitare risultati inaspettati dovuti ai comportamenti diversi delle piattaforme su cui gira la JVM. Provare per credere.
    Verificate le differenze tra Windows e Linux (io uso WinMe e Mandrake 9.0).

    P.S.: se le differenze le ho viste solo io, mi sa tanto che ho conquistato una figura di mxxxa !!!

    P.S.2: Painter.this.repaint(); // brrr
    non è più chiaro [this.]repaint(); ?


  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2002
    Messaggi
    315
    P.S.2: Painter.this.repaint(); // brrr
    non è più chiaro [this.]repaint(); ?
    No, e' orrendo in entrmbi i casi basterebbe repaint();
    Ma questo programma serve solo da esempio, a scopo didattico... quindi non mi pare il caso di soffermarsi su questi dettagli.
    Ciao,
    Lorenzo

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2002
    Messaggi
    1,798
    Ciao lelefante,
    sono daccordo con te, infatti la parola chiave this l'avevo racchiusa tra le quadre per far capire che poteva essere opzionale.
    Anche se "this" può tornare utile, questa volta ho avuto un eccesso di zelo.


  7. #7
    Utente di HTML.it L'avatar di userfra
    Registrato dal
    Jul 2001
    Messaggi
    1,418
    Originariamente inviato da lelefante
    Vedi se cosi' riesci a risolvere.

    codice:
    public void paint(Graphics g) {
      if(paint)
        g.drawLine(startXPoint, startYPoint, endXPoint, endYPoint);
      else
        super.paint(g);
    }
    perfetto!!

    Grazie mille!!!!!!

    Senti, un'altra cosa mi puoi dare una dritta di come posso realizzare, la possibilità di salvare come immagine quello che io disegno?
    -------------------------------------------------
    Il fumo nuoce gravemente alla salute

  8. #8
    so che non è difficile ma non ci ho mai provato, guarda la classe image!
    Blink@go

    "Non tutto quel che è oro brilla, Ne gli erranti sono perduti; Il vecchio ch'è forte non s'aggrinza, Le radici profonde non gelano.Dalle ceneri rinascerà un fuoco, L'ombra sprigionerà una scintilla, Nuova sarà la lama ormai rotta, E re quei ch'è senza corona."

    ------------
    Lang: java 1.4.1 Eclipse

  9. #9
    Utente di HTML.it
    Registrato dal
    Mar 2002
    Messaggi
    315
    Senti, un'altra cosa mi puoi dare una dritta di come posso realizzare, la possibilità di salvare come immagine quello che io disegno?
    Il problema non e' banale, penso tu possa agire in due modi:
    1) dato che il disegno e' a mano libera ti potresti salvare in un file le coordinate dei singoli segmenti che tracci, ed eventualmente anche il colore, se tu intendessi inserire anche quello.

    Vantaggi: pesa meno di un immagine e "sai quello che fai", nel senso che stabilisci tu come memorizzare i dati e come ristampare la stessa immagine da un'altra parte. Inoltre con un po' di ragionamento puoi anche implementare la rotazione, la riduzione in scala, ecc... insomma un ottimo esercizio di programmazione.

    2) Cerchi tra i package di java come ottenere un formato immagine valido (tipo jpg, bmp, ecc.) dall'immagine della memoria (scusa il gioco di parole) di quanto stai visualizzando sullo schermo.

    Vantaggi: se esiste unsa cosa del genre ci pensa il linguaggio a gestirla e tu non ti devi sbattere piu' di tanto.

    Purtroppo sull'argomento grafica non sono molto ferrato, quindi non ti so aiutare di piu'... magari ci sono metodi piu' semplici, ma proprio non saprei.
    Ciao,
    Lorenzo

  10. #10
    Utente di HTML.it
    Registrato dal
    Feb 2002
    Messaggi
    1,798
    codice:
    import java.awt.Graphics2D;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import javax.imageio.ImageIO;
    
    // creare un oggetto RenderedImage
    BufferedImage image = BufferedImage(...);
    // creare un oggetto Graphics per
    // disegnare sull'immagine create
    Graphics2D g = image.createGraphics();
    // creare un oggetto File
    File file = new File("image.jpg");
    // salvare il file
    try {
      /*
        scrivo l'immagine sul file
        specificando il formato (es. JPG)
       */
      ImageIO.write(image, "JPG", file);
    } catch (IOException e) {
      // gestire l'eccezione
    } // try-catch
    
    La classe ImageIO è disponibile dalla versione 1.4 della JDK.

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 © 2025 vBulletin Solutions, Inc. All rights reserved.