Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2003
    Messaggi
    698

    [JAVA] disegnare con swing

    Ho un'area (JPanel) che implementa MouseListener e MouseMotionListener.
    Quello che voglio fare è disegnare delle linee a mano libera (tipo il pennello di paint e questi sw grafici). Allora ho ridefinito il metodo di interfaccia MouseDragged, in cui faccio disegnare un piccolo quadrato nel punto in cui si trova il mouse..l'insieme di tutti i quadrati mi da la linea. Questo funziona e posto il codice per maggior chiarezza:

    codice:
    [...]
    public void MouseDragger (MouseEvent e) {
        Graphics g = this.getGraphics();
        g.fillRect(e.getX(),e.getY(),2,2);
    }
    [...]
    Questo codice fa disegnare la linea, solo che ad un qualunque refresh del jpanel, il disegno sparisce..quello che penso è che al refresh del pannello viene chiamato paint(), in cui non ho specificato di ridisegnare tutto quello che c'era in precedenza che quindi viene perduto.

    La domanda è questa: come faccio a rendere 'persistente' questo disegno? Non dovrò mica salvarmelo da qualche parte e farlo ridisegnare ad ogni chiamata del metodo paint()???

    grazie

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    La risposta è semplice: sposta quel pezzo di codice all'interno del metodo paint() e richiama il metodo repaint() al mouseDragged. Devi, però, definire 2 variabili globali, da cui il metodo paint() prende le informazioni.
    codice:
    public void MouseDragger(MouseEvent me) {
       posX = e.getX();
       posY = e.getY();
       repaint();
    }
    
    public void paint(Graphics g) {
       g.fillRect(posX,posY,2,2);
    }
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    Devi memorizzarti il disegno e ridisegnarlo in paintComponent.

    Guarda questo thread in cui ho spiegato come fare una cosa simile:

    http://forum.html.it/forum/showthrea...hlight=lavagna

    In particolare ho definito una classe per rappresentare dei tratti di disegno o di cancellazione, ogni volta che l'utente disegna un tratto questo viene memorizzato in un vettore; in paintComponento quindi tutti i tratti vengono ridisegnati.

    Oviamente se devi fare un programma di grafica pesante bisogna cercare strategie piu efficineti che nonrichiedano il disegno di tutti i tratti tutte le volte.


    Sun Certified Java Programmer

    EUCIP Core Level Certified

    European Certification of Informatics Professionals

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2003
    Messaggi
    698
    lele mi sa che se faccio come dici te, poi ad esempio iconizzo il frame e lo riapro, mi rimane solo l'ultimo disegno fatto

    purtroppo temevo di dover fare una cosa del genere descritto da anx...


    grazie ad entrambi...ma possibile che non ci sia un metodo che aggiorna il contesto grafico del jpanel con tutte le modifiche che uno gli apporta?


  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Sì... effettivamente fa così. Non avevo idea che tu dovessi disegnare più tratti. Se devi fare una cosa simile ad una lavagna, devi utilizzare un Vector o una qualunque altra struttura dati per memorizzare tutti i tratti disegnati e dire al metodo paint() o paintComponent() di ridisegnare l'intero contenuto della struttura dati.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2003
    Messaggi
    698
    purtroppo mi sa proprio di si, e mi sono rimesso al lavoro

    non si finisce mai

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