Pagina 1 di 7 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 69

Discussione: Inserimento Scroll

  1. #1

    Inserimento Scroll

    questo è un progetto per disegnare il frattale di mandelbrot soltanto che quando provo ad inserire lo scroll non va, o meglio non mi compaiono le scrollbar ma il disegno me lo fa
    codice:
    import java.awt.Canvas;
    import java.awt.Color;
    import java.awt.Graphics;
    import java.util.Random;
    import java.awt.Color;
    import java.io.*;
    import java.util.*;
    import javax.swing.JFrame;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    public class PixelCanvas extends Canvas {
    	
    	
    	public static Color colore(int c){
    	Color f;
        int i = c % 16;
       if(i==0)
      return f=new Color(66, 30, 15);
        if(i==1)
        return f=new Color(25, 7, 26);
        if(i==2)
        return f=new Color(9, 1, 47);
         if(i==3)
       return f=new Color(4, 4, 73);
         if(i==4)
        return f=new Color(0, 7, 100);
         if(i==5)
       return f=new Color(12, 44, 138);
         if(i==6)
        return f=new Color(24, 82, 177);
         if(i==7)
       return f=new Color(57, 125, 209);
         if(i==8)
       return f=new Color(134, 181, 229);
         if(i==9)
        return f=new Color(211, 236, 248);
         if(i==10)
        return f=new Color(241, 233, 191);
         if(i==11)
       return f=new Color(248, 201, 95);
         if(i==12)
       return f=new Color(255, 170, 0);
         if(i==13)
       return f=new Color(204, 128, 0);
         if(i==14)
        return f=new Color(153, 87, 0);
         if(i==15)
        return f=new Color(106, 52, 3);
       return f=new Color(106, 52, 3);
    	}
    	   
        public static Color colore2(int c){
        	Color f;
    if (c < 64) {
      return f=new Color(c * 2, 0, 0);    
    } else if (c < 128) {
      return f=new Color  ((((c - 64) * 128) / 126) + 128, 0, 0);    /* 0x0080 to 0x00C0 */
    } else if (c < 256) {
      return f=new Color  ((((c - 128) * 62) / 127) + 193, 0, 0);    /* 0x00C1 to 0x00FF */
    } else if (c < 512) {
      return f=new Color  (255, (((c - 256) * 62) / 255) + 1, 0);    /* 0x01FF to 0x3FFF */
    } else if (c < 1024) {
      return f=new Color (255, (((c - 512) * 63) / 511) + 64, 0);   /* 0x40FF to 0x7FFF */
    } else if (c < 2048) {
      return f=new Color (255, (((c - 1024) * 63) / 1023) + 128, 0);   /* 0x80FF to 0xBFFF */
    } else if (c < 4096) {
      return f=new Color (255, (((c - 2048) * 63) / 2047) + 192, 0);   /* 0xC0FF to 0xFFFF */
    } 
     return f=new Color (255, 255, 0);
     }
    	
    	 
            public static double[] quad(double a,double b){
            	
            double z=Math.pow(a,2) -Math.pow(b,2);
            double z1=2*a*b;
            
           	double z2[]={z,z1};
           	return z2;
            }
       	
       		public  int funz(double a,double b){
       		double re=a,co=b;
       			a=0;
       			b=0;
       	 int c=0;
       	 while(Math.sqrt(Math.pow(a,2)+Math.pow(b,2))<2 && c<ite){
       	 
       		
       		double v[]=quad(a,b);	
    		double z1=(v[0]+re);
       		double z2=(v[1]+co);
       	
       		
       		a=z1;
       		b=z2;
       		c++;
       	   }
       		return c;
      	}
      	Scanner in = new Scanner(System.in);
      	
    	public  final int ite=Integer.parseInt(in.next());
        public static final int WIDTH = 1200;
        public static final int HEIGHT= 1200;
        int w=WIDTH/2;
        
        int h=HEIGHT/2;
        
        public void paint(Graphics g) {
            super.paint(g);
            
    Color bo;
    
    
    
    
          for(int i=-h;i<h;i++){
    	for(int y=-w;y<w;y++){
    	double a=(double)i/(h/2);
    	double b=(double)y/(w/2);
    		int c=funz(a,b);
    		if(c==ite){
    		
    			g.drawLine(i+h,y+w,i+h,y+w);
    	        g.setColor(Color.black);
    	    }
            else{
            		g.setColor(colore(c));
            		g.drawLine(i+h,y+w,i+h,y+w);
    	           
            }
    
    
           }
          }
    
    
        
        }
        
        
        
         
     
        public static void main(String[] args) {
            System.out.println("Inserire numero di iterzioni");
            
            JPanel jp=new JPanel();
            JScrollPane pane=new JScrollPane(jp,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);    
            JFrame frame = new JFrame();
            
            frame.add(pane);
           
           
            frame.add(new PixelCanvas() );
           
            
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            
            frame.setSize(WIDTH, HEIGHT);
       
            
            frame.setVisible(true);
            
            //frame.setContentPane(pane);
           
           
        }
    }
    Ultima modifica di MItaly; 25-05-2016 a 09:08

  2. #2
    Utente di HTML.it
    Registrato dal
    Oct 2014
    residenza
    Padova
    Messaggi
    361
    Quote Originariamente inviata da rangers97 Visualizza il messaggio
    questo è un progetto per disegnare il frattale di mandelbrot
    Intanto grazie per aver postato questo esempio: non conoscevo il frattale di mandelbrot ed è davvero interessante, dopo mi cerco un po' di materiale

    Quote Originariamente inviata da rangers97 Visualizza il messaggio
    quando provo ad inserire lo scroll non va, o meglio non mi compaiono le scrollbar ma il disegno me lo fa
    Questo accade perché con il tuo codice il JScrollPane che crei non viene in realtà aggiunto al JFrame, o meglio viene aggiunto ma poi "rimpiazzato" dal PixelCanvas che aggiungi dopo.
    Infatti se provi a rimuovere o commentare la riga di codice con cui aggiungi il PixelCanvas al frame, vedrai apparire lo scrollpane con le scrollbar.

    Se intendevi solo fare in modo che le scrollbar apparissero nel canvas che hai creato puoi aggiungere direttamente il canvas allo scrollpane, invece di aggiungerci un pannello che poi non usi.
    Una cosa di questo tipo:

    codice:
    JScrollPane pane=new JScrollPane(new PixelCanvas(),JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
    Poi aggiungi solo il JScrollPane al tuo frame oppure, cosa molto più pulita, lo setti come content pane come fai nella riga commentata in fondo.

    Infatti non è buona pratica aggiungere i componenti direttamente al frame, andrebbero aggiungi al content pane del tuo frame, oppure a un componente che poi viene settato come content pane (come in questo caso).

    Oltre a questo ci sono diverse cose che non vanno molto bene nel codice che hai postato, un esempio è il miscuglio tra componenti di awt e swing, o la lettura da scanner che fai all'interno del canvas, o l'inefficienza dei metodi colore e colore2 (che tra l'altro vengono richiamati milioni di volte all'interno del paint, quindi immagino possano rallentare di molto l'esecuzione)...

    Immagino che l'interesse fosse rivolto principalmente al frattale e non alla costruzione del frame, ma il miglioramento di questa parte potrebbe essere molto utile

    PS: ricordati di inserire il tuo codice all'interno dei tag [CODE] per mantenerlo formattato, ora l'ha fatto un moderatore ma non costringiamoli sempre a dover intervenire

  3. #3
    grazie per la spiegazione molto precisa, premetto che ho fatto java per 2 anni ma mai la grafica e mi sono avvicinato da 2 giorni per creare il frattale per la maturità, quindi la mia conoscenza su la grafica di java è 0. Ho provato come hai detto e in effetti aggiunge le scroll bar, ma il mio intento è creare un'immagine più grande dello schermo in modo da ingradire il frattale e poi spostarsi con le scrollbar, ma questo non posso farlo ,la finestra è grande come lo schermo e basta non posso spostarmi
    ps. le funzioni colore per ogni punto devono assegnarli il colore appropiato quindi è giusto che vengano chiamate così tante volte
    Ultima modifica di rangers97; 25-05-2016 a 10:20

  4. #4
    Utente di HTML.it
    Registrato dal
    Oct 2014
    residenza
    Padova
    Messaggi
    361
    Quote Originariamente inviata da rangers97 Visualizza il messaggio
    il mio intento è creare un'immagine più grande dello schermo in modo da ingradire il frattale e poi spostarsi con le scrollbar, ma questo non posso farlo ,la finestra è grande come lo schermo e basta non posso spostarmi
    Il fatto è che, anche se l'immagine è più grande dello schermo (prova ad impostare ad esempio WIDTH e HEIGHT a 2000 o più), le scrollbar non vengono inserite in automatico, ma compaiono solo per la proprietà che hai impostato tu (...SCROLLBAR_ALWAYS).

    Questo è normale perchè il JScrollPane è fatto in modo da aggiungere le scrollbar se la dimensione di ciò che deve contenere (nel tuo caso il PixelCanvas) è maggiore della propria dimensione.
    Ma questo lui non lo può sapere, perché il PixelCanvas che crei non ha alcuna dimensione assegnata: il fatto che tu ci disegni sopra con paint non ne modifica la dimensione, devi settarla in prima persona.
    Prova a creare un costruttore di PixelCanvas in cui scrivi solo questo (per ora):

    codice:
    public PixelCanvas()
    {
        setSize(WIDTH,HEIGHT);
    }
    A questo punto il PixelCanvas ha una dimensione tale da richiedere la "comparsa" delle scroll bar, anche se non lo specifichi tu (io al JScrollPane passerei come parametri JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED [anche per l'orizzontale] proprio per lasciare che le barre appaiano solo se necessario).
    A questo punto puoi fare in modo di settare una dimensione minore al frame, in modo che non occupi proprio tutto lo schermo, cosa abbastanza fastidiosa, soprattutto se esce...

    Quote Originariamente inviata da rangers97 Visualizza il messaggio
    ps. le funzioni colore per ogni punto devono assegnarli il colore appropiato quindi è giusto che vengano chiamate così tante volte
    Io non mi riferivo infatti al fatto che venga chiamato così tante volte (magari si potrebbe ottimizzare anche questa parte, ma non ho guardato ancora e non sono certo un esperto).
    Intendevo dire che, proprio perché viene chiamato così spesso, la funzione colore al suo interno potrebbe essere scritta meglio.
    Quella catena di if con creazione di un nuovo colore ogni volta appesantisce molto il codice.

    Io ti consiglierei di creare una sola volta un vettore di colori desiderati (quando crei il canvas) :

    Invece che richiamare la funzione colore scrivendo
    codice:
    g.setColor(colore(c));

    a questo punto potresti fare
    codice:
    int i = c % 16;
    g.setColor(colors[i]);

    dove colors è il vettore di colori creato all'inizio.
    Con qualche modifica la cosa funziona anche per colore2 ...
    Ultima modifica di Ansharja; 25-05-2016 a 10:50

  5. #5
    ok grazie mille , però adesso sorge un'altro problema ovvero posso scendere con l'immagine ma non esiste niente , ovvero crea l'immagine solamente nel punto iniziale e se scendo nn c'è niente.
    ho anche provato a modificare il colore, intendevi così??

    codice:
    import java.awt.Canvas;
    import java.awt.Color;
    import java.awt.Graphics;
    import java.util.Random;
    import java.awt.Color;
    import java.io.*;
    import java.util.*;
    import javax.swing.JFrame;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    
    
    public class PixelCanvas extends Canvas {
    
    
        public static Color colore(int c) {
            Color f;
            int i = c % 16;
            if (i == 0) {
                return f = new Color(66, 30, 15);
            }
            if (i == 1) {
                return f = new Color(25, 7, 26);
            }
            if (i == 2) {
                return f = new Color(9, 1, 47);
            }
            if (i == 3) {
                return f = new Color(4, 4, 73);
            }
            if (i == 4) {
                return f = new Color(0, 7, 100);
            }
            if (i == 5) {
                return f = new Color(12, 44, 138);
            }
            if (i == 6) {
                return f = new Color(24, 82, 177);
            }
            if (i == 7) {
                return f = new Color(57, 125, 209);
            }
            if (i == 8) {
                return f = new Color(134, 181, 229);
            }
            if (i == 9) {
                return f = new Color(211, 236, 248);
            }
            if (i == 10) {
                return f = new Color(241, 233, 191);
            }
            if (i == 11) {
                return f = new Color(248, 201, 95);
            }
            if (i == 12) {
                return f = new Color(255, 170, 0);
            }
            if (i == 13) {
                return f = new Color(204, 128, 0);
            }
            if (i == 14) {
                return f = new Color(153, 87, 0);
            }
            if (i == 15) {
                return f = new Color(106, 52, 3);
            }
            return f = new Color(106, 52, 3);
        }
    
    
        public static Color colore2(int c) {
            Color f;
            if (c < 64) {
                return f = new Color(c * 2, 0, 0);
            } else if (c < 128) {
                return f = new Color((((c - 64) * 128) / 126) + 128, 0, 0);
                /* 0x0080 to 0x00C0 */
            } else if (c < 256) {
                return f = new Color((((c - 128) * 62) / 127) + 193, 0, 0);
                /* 0x00C1 to 0x00FF */
            } else if (c < 512) {
                return f = new Color(255, (((c - 256) * 62) / 255) + 1, 0);
                /* 0x01FF to 0x3FFF */
            } else if (c < 1024) {
                return f = new Color(255, (((c - 512) * 63) / 511) + 64, 0);
                /* 0x40FF to 0x7FFF */
            } else if (c < 2048) {
                return f = new Color(255, (((c - 1024) * 63) / 1023) + 128, 0);
                /* 0x80FF to 0xBFFF */
            } else if (c < 4096) {
                return f = new Color(255, (((c - 2048) * 63) / 2047) + 192, 0);
                /* 0xC0FF to 0xFFFF */
            }
            return f = new Color(255, 255, 0);
        }
    
    
        public static double[] quad(double a, double b) {
    
    
            double z = Math.pow(a, 2) - Math.pow(b, 2);
            double z1 = 2 * a * b;
    
    
            double z2[] = {z, z1};
            return z2;
        }
    
    
        public int funz(double a, double b) {
            double re = a, co = b;
            a = 0;
            b = 0;
            int c = 0;
            while (Math.sqrt(Math.pow(a, 2) + Math.pow(b, 2)) < 2 && c < ite) {
    
    
                double v[] = quad(a, b);
                double z1 = (v[0] + re);
                double z2 = (v[1] + co);
    
    
                a = z1;
                b = z2;
                c++;
            }
            return c;
        }
        Scanner in = new Scanner(System.in);
    
    
        public final int ite = Integer.parseInt(in.next());
        public static final int WIDTH = 2000;
        public static final int HEIGHT = 2000;
        int w = WIDTH / 2;
    
    
        int h = HEIGHT / 2;
    
    
        public void paint(Graphics g) {
        	
        	
            super.paint(g);
            
            Color [] colore=new Color[16];
            colore[0]=new Color(66, 30, 15);
            colore[1]=new Color(25, 7, 26);
            colore[2]=new Color(9, 1, 47);
            colore[3]=new Color(4, 4, 73);
            colore[4]=new Color(0, 7, 100);
            colore[5]=new Color(12, 44, 138);
            colore[6]=new Color(24, 82, 177);
            colore[7]=new Color(57, 125, 209);
            colore[8]=new Color(134, 181, 229);
            colore[9]=new Color(211, 236, 248);
            colore[10]=new Color(241, 233, 191);
            colore[11]=new Color(248, 201, 95);
            colore[12]=new Color(255, 170, 0);
            colore[13]=new Color(204, 128, 0);
            colore[14]=new Color(153, 87, 0);
            colore[15]=new Color(106, 52, 3);
            
            
            
            Color bo;
    
    
            for (int i = -h; i < h; i++) {
                for (int y = -w; y < w; y++) {
                    double a = (double) i / (h / 2);
                    double b = (double) y / (w / 2);
                    int c = funz(a, b);
                    if (c == ite) {
    
    
                        g.drawLine(i + h, y + w, i + h, y + w);
                        g.setColor(Color.black);
                    } else {
                        g.setColor(colore[c%16]);
                        g.drawLine(i + h, y + w, i + h, y + w);
    
    
                    }
    
    
                }
            }
    
    
        }
        public PixelCanvas()
    {
        setSize(WIDTH,HEIGHT);
    }
    
    
        public static void main(String[] args) {
            System.out.println("Inserire numero di iterzioni");
    
    
            JPanel jp = new JPanel();
            
            JScrollPane pane = new JScrollPane(new PixelCanvas(), JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
            JFrame frame = new JFrame();
    		
    	frame.setSize(WIDTH, HEIGHT);
           frame.setContentPane(pane);
    
    
            
    
    
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
    
            
            
            frame.setVisible(true);
    
    
        }
    }
    Ultima modifica di rangers97; 25-05-2016 a 11:12

  6. #6
    Utente di HTML.it
    Registrato dal
    Oct 2014
    residenza
    Padova
    Messaggi
    361
    Quote Originariamente inviata da rangers97 Visualizza il messaggio
    ok grazie mille , però adesso sorge un'altro problema ovvero posso scendere con l'immagine ma non esiste niente , ovvero crea l'immagine solamente nel punto iniziale e se scendo nn c'è niente.
    Sembra che il metodo paint venga applicato solo sulla parte visibile del componente, se muovi le scrollbar viene richiamato solo a volte, mentre se provi a ridimensionare la finestra allora si aggiorna correttamente.
    Non so bene da cosa questo dipenda: io sono abituato a fare "custom painting" facendo l'override del metodo paintComponent e non di paint.

    Se vuoi provare ad usare paintComponent però devi apportare alcune modifiche al codice perché è un metodo proprio di JComponent e figli (Canvas non è un JComponent perché fa parte della libreria awt e non di swing).

    Quindi dovresti ad esempio utilizzare un JPanel al posto del Canvas (cosa che io farei comunque visto che, come dicevo, il miscuglio dei componenti di awt/swing è sconsigliato), fare l'override di paintComponent al posto di paint (con l'attenzione di dichiarare protected il metodo, come nella versione originale, e di richiamare all'interno il paintComponent della superclasse) e modificare il setSize(int,int) che fai nel costruttore di PixelCanvas in setPreferredSize(new Dimension(int,int)) visto che non mi appaiono le scrollbar se faccio solo setSize (non mi è chiarissimo il perché in realtà, ma di solito vedo che è applicato il setPreferredSize e mi sono abituato anch'io).

    Con queste modifiche in effetti il problema del pannello vuoto non si presenta, perché muovendo le scrollbar il pannello viene ridisegnato in automatico.

    Tuttavia il ricaricamento, almeno nel mio pc vecchiotto e pieno di schifezze, è lento da paura e praticamente blocca l'applicazione.

    Non è una cosa semplicissima da risolvere per me, nel senso che all'interno del paint o paintComponent vengono fatte moltissime operazioni, e senza la giusta preparazione è molto difficile rendere il tutto più fluido...

    Quote Originariamente inviata da rangers97 Visualizza il messaggio
    ho anche provato a modificare il colore, intendevi così??
    In realtà intendevo di farlo fuori dal metodo paint, per doverlo fare solo all'inizializzazione del canvas o del pannello.
    Cioè dichiari come variabile della classe il tuo vettore colore, e nel costruttore lo popoli con i colori scelti

  7. #7
    Grazie mi hai salvato la vita, stavo impazzendo , un ultima cosa , avresti qualche consiglio su come ottimizzare il codice,visto che nonostante il mio pc sia molto buno , il programma non è fluido?

  8. #8
    Utente di HTML.it
    Registrato dal
    Oct 2014
    residenza
    Padova
    Messaggi
    361
    Purtroppo quando dicevo "senza la giusta preparazione" mi riferivo anche a me, nel senso che nelle mie applicazioni ho sempre disegnato immagini o comunque figure relativamente "leggere", nel tuo codice crei un "mostro" da milioni e milioni di operazioni ...

    Però potrebbero esserci delle scappatoie, a me ne viene in mente una ora, che funzionerebbe nel caso che a te serva creare una sola volta il frattale, cioè senza modificarlo durante l'esecuzione del programma... è questo il caso?

  9. #9
    il mio intento era quello di vedere che ingrandendole si creano dei dettagli nuovi , soltanto che non sapendo ingrandire solo una parte allora ho provato ad ingrandirla tutta spostandomi nella figura.
    Adesso mi accorgo che il calcolo è esponenziale e quindi aumentando la figura aumentano le combinazioni esponenzialmente, rendendole pesanti. Una soluzione è usare i processori della scheda video che da quello che so sono molto più potenti del processore normale sopratutto nel renderizzare le immagini, ma io la scarterei visto che ne so meno di -200 , un altra soluzione non potrebbe essere salvarmi la foto così me la guardo successivamente "in locale" ma non so se si possono creare foto più grandi dello schermo.

  10. #10
    Utente di HTML.it
    Registrato dal
    Oct 2014
    residenza
    Padova
    Messaggi
    361
    Per quanto riguardo i processori della scheda video, non ne ho la più pallida idea, sul serio

    Sicuramente la tecnica dell'immagine, che è quello che avevo pensato anch'io, è fattibile.
    In realtà l'immagine non è necessario che sia salvata in locale, o meglio lo puoi fare, ma se vuoi mantenere il frame con le scroll bar per muoverti su e giù nell'immagine, la cosa è molto semplice.
    Volendo puoi anche crearne di diverse (variando numero di iterazioni,grandezza etc.) e avere dei tasti per cambiare immagine da dentro il frame, è tutto fattibile.

    L'importante è non dover modificare l'immagine mentre ti sposti con la scrollbar, perché è quello che rallenta terribilmente l'esecuzione...

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.