Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2013
    Messaggi
    78

    [JAVA] Disegnare con applet

    Buonasera, mi sono appena cimentato con le Applet e ho fatto qualche prova.
    Volevo provare a disegnare qualcosa di semplice e tramite il metodo paint ho disegnato i classici due rettangoli per prova. Ora io vorrei però fare un disegno un pò più complesso che ho già creato in una classe che disegnava su JPanel.
    Intuisco che la classe sia da modificare in qualcosa, ma non so bene cosa, infatti mi dice:

    error: method draw in class Graphics2D cannot be applied to given types;
    g2.draw(dis);
    ^
    required: Shape
    found: Disegno

    la classe disegno è del tipo:
    codice:
    public class Disegno extends JPanel{
        campi vari
    
        public Disegno(parametri vari){
             inizializzazione campi
        }
        
        public void paint(Graphics g){
    		Graphics2D g2=(Graphics2D)g;
    		Rectangle po=new Rectangle(posX+1,posY+1,lato-2,lato-2);
    		Rectangle borP=new Rectangle(posX,posY,lato,lato);
    		g2.draw(borP);
    		g2.setColor(colore);
    		g2.fill(po);
    		g2.draw(po);
    		g2.setColor(Color.BLACK);
    	}//paint
    }
    cosa devo fare per poter disegnare anche da classi esterne? Grazie

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

    Re: [JAVA] Disegnare con applet

    Originariamente inviato da Polly008
    Volevo provare a disegnare qualcosa di semplice e tramite il metodo paint ho disegnato i classici due rettangoli per prova.
    Innanzitutto nei componenti Swing (quindi anche JPanel) il metodo "clou" di disegno è

    protected void paintComponent(Graphics g)

    non paint. paint esiste ancora perché è il metodo pubblico che c'è sempre stato ed è quello invocato alla radice di tutto il painting ma Swing poi "fattorizza" la fase di disegno i 3 parti, vedi A Closer Look at the Paint Mechanism

    Originariamente inviato da Polly008
    error: method draw in class Graphics2D cannot be applied to given types;
    g2.draw(dis);
    ^
    required: Shape
    found: Disegno
    Non so cosa volevi fare ma non ha senso passare una istanza di Disegno al draw!

    Originariamente inviato da Polly008
    cosa devo fare per poter disegnare anche da classi esterne?
    La questione è posta male ... non sono le altre classi che devono poter disegnare direttamente sulla superficie di Disegno (se è questo che intendevi) e nemmeno che altre classi possano usare una istanza di Disegno da disegnare altrove (se è questo che intendevi con g2.draw(dis))

    È la tua classe Disegno che deve sapere come/dove disegnare e basta. Se vuoi che il disegno sia controllabile dall'esterno, devi offrire dei metodi pubblici che forniscono i dati e che internamente sappiano come/dove richiedere il repaint del componente in modo che tutto possa ridisegnarsi al paintComponent.

    Non è facile spiegarlo a parole, ecco un esempio più pratico (banale e, nota, senza ottimizzazioni particolari): vuoi che nel tuo pannello-Disegno si possano aggiungere dall'esterno N righe descritte da 2 coordinate. In Disegno terrai una collezione (lista) di oggetti che rappresentano le linee. Aggiungerai un metodo es.
    public void aggiungiLinea(int x1, int y1, int x2, int y2)
    In questo metodo aggiungi la linea alla collezione e poi chiedi un repaint() per aggiornare tutto il componente. Nel paintComponent scansioni la lista delle linee e le disegni tutte una per volta.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2013
    Messaggi
    78
    Mamma mia, mi rendo conto che veramente non so niente.
    Intanto premetto che, purtroppo, non ho capito bene la tua risposta, sicuramente per mie lacune.

    Tempo fa avevo fatto un applicazione che gestiva e disegnava "tante classi Disegno" in posizioni e dimensioni diverse ed erano fatte tutte con paint. Io semplicemente nella classe in cui gestivo i vari disegni facevo semplicemente g2.paint(oggettoDisegno).
    Pensavo che per le applet funzionasse alla stessa maniera.

    Ora io in questa applet vorrei rifare quello che facevo sull'applicazione normale, cioè gestire tanti oggetti di una classe (disegnabile).

    Questa classe come la devo costruire e poi disegnare?

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Polly008
    Io semplicemente nella classe in cui gestivo i vari disegni facevo semplicemente g2.paint(oggettoDisegno).
    g2 è il Graphics2D? Non ha un paint( ? ) ... quindi non ho idea di cosa stai parlando.

    Originariamente inviato da Polly008
    Pensavo che per le applet funzionasse alla stessa maniera.
    Non è questione delle "applet". Il concetto del painting è uguale tra applet e applicazioni "desktop". Solo che se si usano i componenti Swing bisogna sapere quale è la filosofia del painting nei componenti Swing che è leggermente diversa/meno diretta rispetto a quanto si può fare direttamente su un java.applet.Applet o un java.awt.Canvas.

    Originariamente inviato da Polly008
    Ora io in questa applet vorrei rifare quello che facevo sull'applicazione normale, cioè gestire tanti oggetti di una classe (disegnabile).

    Questa classe come la devo costruire e poi disegnare?
    Dipende cosa sono quei "oggetti" di cui parli.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2013
    Messaggi
    78
    dopo essermi schiarito un pò le idee e letto qualcosa in internet riguardo Swing Awg sono arrivato a questo punto:

    Prima classe:
    codice:
    import java.awt.*;
    import javax.swing.*;
    
    public class Disegno extends JPanel{
    
    	private int posX;
    	private int posY;
    	private static final int lato=30;
    	Color colore;
    	
    	public Disegno(int x,int y, Color c){
    		posX=x;
    		posY=y;
    		colore=c;
    	}
    	
    	public void paint(Graphics g){
    		Graphics2D g2=(Graphics2D)g;
    		Rectangle p=new Rectangle(posX+1,posY+1,lato-2,lato-2);
    		Rectangle borP=new Rectangle(posX,posY,lato,lato);
    		g2.draw(borP);
    		g2.setColor(colore);
    		g2.fill(p);
    		g2.draw(p);
    		g2.setColor(Color.BLACK);
    	}//paint
    	
    	public int getLato(){
    		return lato;
    	}//getLato
    
    }//Disegno
    Seconda
    codice:
    import javax.swing.*;
    import java.awt.*;
    
    public class Applet extends JApplet { 
    	public void init() {
    		
    	}
    	
    	public void paint(){
    		Container contentPane = getContentPane(); 
    		Disegno pol = new Disegno(10,20,Color.RED);
    		contentPane.add(pol);
    		Disegno pol2 = new Disegno(10,40,Color.RED);
    		contentPane.add(pol2);
    	}
    
    }
    Ora le mie domande sono:
    -perché così com'è Applet non mi disegna bensì devo richiamare paint() dentro init()? Da quanto ho capito dovrebbe farlo da solo;
    -perchè vedo disegnato solo pol2 e mi cancella ciò che è già esistente?

    Grazie

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Polly008
    Ora le mie domande sono:
    -perché così com'è Applet non mi disegna bensì devo richiamare paint() dentro init()? Da quanto ho capito dovrebbe farlo da solo;
    Innanzitutto tecnicamente il paint è

    public void paint(Graphics g)
    (tu hai fatto un overload ... non un override)

    Ma comunque JApplet è Swing, e l'ho già detto prima che in Swing il painting si fa in paintComponent. paint è il metodo "a monte" di tutto e in Swing non andrebbe toccato a meno di sapere esattamente cosa fare e perché con paint.

    In ogni caso il concetto che stai applicando non ha senso: un oggetto Disegno non è qualcosa che un'altra classe può "disegnare" quando vuole da qualche parte (non certo in un paint/paintComponent). Disegno è un componente a sé stante, si disegna da solo e va messo dentro un "contenitore".

    Originariamente inviato da Polly008
    -perchè vedo disegnato solo pol2 e mi cancella ciò che è già esistente?
    JApplet (come JFrame, JDialog) ha una struttura più complessa rispetto ai Applet e Frame/Dialog di AWT. Ha un JRootPane che contiene il "content pane" (un contenitore che materialmente è un JPanel) che è dove si mettono i componenti.
    Il content pane ha per default un BorderLayout. Fare contentPane.add(unComponente) fa inserire unComponente nell'area CENTER di BorderLayout che è una sola (BorderLayout ha solo 5 aree).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2013
    Messaggi
    78
    In ogni caso il concetto che stai applicando non ha senso: un oggetto Disegno non è qualcosa che un'altra classe può "disegnare" quando vuole da qualche parte (non certo in un paint/paintComponent). Disegno è un componente a sé stante, si disegna da solo e va messo dentro un "contenitore".
    Infatti lo metto dentro a un contenitore.

    Comunque nel mio libro delle superiori che avevano mi hanno insegnato a fare così i disegni, ma mi sembra di capire che mi han insegnato tante calzate..

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Polly008
    Infatti lo metto dentro a un contenitore.
    Sì .. ma non dall'interno di un paint/paintComponent di qualcos'altro!!
    Perché un paint/paintComponent viene invocato innumerevoli volte e tu aggiungeresti ogni volta il componente nel contenitore. Se invece di un BorderLayout (che almeno mostra max 5 componenti) fosse un FlowLayout, ad ogni repaint aggiungeresti il componente .... e ti sembra sensato?
    Insomma, dentro un paint/paintComponent non andrebbe mai toccato un layout!

    Originariamente inviato da Polly008
    Comunque nel mio libro delle superiori che avevano mi hanno insegnato a fare così i disegni, ma mi sembra di capire che mi han insegnato tante calzate..
    Uhm, capisco. Se vuoi posso farti un piccolo esempio di come gestire un pannello su cui è possibile disegnare un numero "arbitrario" di figure.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Utente di HTML.it
    Registrato dal
    Feb 2013
    Messaggi
    78
    sarà sbagliatissimo ma ho provato così e funziona esattamente come volevo:
    codice:
    public void paint(Graphics g){
            	Disegno pol2 = new Disegno(10,40,Color.RED);
    		pol2.paint(g);
    	}
    disegno nel punto che gli passo e quanti ne voglio

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Polly008
    sarà sbagliatissimo ma ho provato così e funziona esattamente come volevo:
    codice:
    public void paint(Graphics g){
            	Disegno pol2 = new Disegno(10,40,Color.RED);
    		pol2.paint(g);
    	}
    disegno nel punto che gli passo e quanti ne voglio
    Certo, così tecnicamente ottieni il disegno. Ma resta il fatto che se Disegno è-un componente (es. estende JPanel) tu non lo stai usando come "componente" Swing.

    A questo punto allora, piuttosto, definisci una tua gerarchia di tipi "disegnabili", partendo ad esempio da una interfaccia:

    codice:
    public interface FiguraDisegnabile {
        void disegna(Graphics2D g);
    }
    E poi con implementazioni concrete es. RettangoloColorato, ecc...
    Potresti poi avere un tuo pannello (che estende JPanel) che "sa" come disegnare uno o più FiguraDisegnabile, ad esempio tenendo una collezione di questi oggetti, offrendo metodi per aggiungerne di nuovi, ecc...

    Questo sarebbe stato l'esempio che avrei potuto farti (ma l'ho spiegato qui a parole).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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.