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

    come evitare il repaint ad ogni movimento del mouse

    ciao a tutti,
    ho bisogno di un aiuto urgente. In pratica devo disegnare 10 ellissi di dimensione e posizione casuale che si aggiornano ogni volta che premo il pulsante aggiorna o inserisco un numero nella casella di testo.
    Il problema è che non so come evitare il repaint delle ellissi se semplicemente abbasso o sposto la finestra. Grazie mille a chiunque possa aiutarmi

    Questo il file contenente il metodo main

    codice:
    import javax.swing.JFrame;
    public class Ellissi2Viewer {
    	public static void main (String[] args){
    		
    		Ellissi2 frame = new Ellissi2 ();
    		frame.setSize (800,800);
    		frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
    		frame.setVisible (true);
    		
    	}	
    }
    E questo il file contenente pulsanti e disegno

    codice:
    import javax.swing.*;
    import java.awt.*;
    import java.awt.geom.*;
    import java.awt.event.*;
    import java.util.Random;
    
     public class Ellissi2 extends JFrame {
     	
     	//variabili istanza dei panel che creo
     	private JPanel componentiPanel;
     	private PannelloApplicazione disegnoPanel;//il Panel che creo dopo
    
     	//variabili istanza dei componenti
     	private JLabel etichetta;
     	private JTextField casellaTesto;
     	private JButton aggiornaButton;
     	
     	//variabili istanza
     	private int numEllissi = 10;
     	
     	public Ellissi2(){
     		
     		componentiPanel = new JPanel();
     		disegnoPanel = new PannelloApplicazione(this);
     		etichetta = new JLabel("numero di ellissi");
     		casellaTesto = new JTextField("10");//una casella di testo contenente "10"
     		aggiornaButton = new JButton("aggiorna");
     		
     		casellaTesto.setPreferredSize(new Dimension (100,25));
     		
     		//aggiungo i componenti a componentiPanel
     		componentiPanel.add(etichetta);
     		componentiPanel.add(casellaTesto);
     		componentiPanel.add(aggiornaButton);
     		
     		//aggiungo i panel al frame
     		//utilizzando come layout manager BorderLayout
     		add(componentiPanel, BorderLayout.NORTH);
     		add(disegnoPanel, BorderLayout.CENTER);
     		
     		//aggiungo i listener ai componenti
     		aggiornaButton.addActionListener(new AggiornaButtonListener());
     		casellaTesto.addActionListener(new CasellaTestoListener());
     					
     	}
     
     /**Una classe interna che contiene aggiornaButton
        e implementa l'interfaccia ActionListener 
      */
      private class AggiornaButtonListener implements ActionListener{
      	
      	public void actionPerformed(ActionEvent e){
      		
      		if (numEllissi != 10){
      			disegnoPanel.aggiornaDisegno();
      		}
      
      	}
      }//fine classe AggiornaButtonListener	
      
      	
     /**Una classe interna che contiene casellaTesto
        e implementa l'interfaccia ActionListener 
      */
       private class CasellaTestoListener implements ActionListener{
    
      	public void actionPerformed(ActionEvent event){
      		String numeroEllissi = casellaTesto.getText();
      		
      		try{
      			numEllissi = Integer.parseInt(numeroEllissi);
      		}
      		
      		//se il valore inserito non è valido
      		//imposto a 10 il numEllissi
      		catch (Exception e){
      			numEllissi = 10;
      			casellaTesto.setText("10");
      		}
      		disegnoPanel.aggiornaDisegno();
      	}  	 
      }//fine classe CasellaTestoListener
      
     /**metodo pubblico che verrà invocato dalla classe PannelloApplicazione
        per accedere al valore della variabile istanza numEllissi
      */
      public int getNumEllissi(){
      	return this.numEllissi;
      }  
      	
      }//qui finisce la classe Ellissi2
    
    /**Una nuova classe che estende JPanel
       e rappresenta il pannello interno della finestra
     */
     class PannelloApplicazione extends JPanel{
     	
     	//variabili istanza
     	private Ellissi2 nE;//mi serve per invocare getNumEllissi()
     	                    //della classe Ellissi2
     	
     	/**Il costruttore della classe PannelloApplicazione
     	 */
     	 public PannelloApplicazione(Ellissi2 ellissiFrame){
     	 	nE = ellissiFrame;
     	 }
     	 
     	/**metodo pubblico che verrà invocato dai componenti
     	   della classe Ellissi2
     	 */
     	 public void aggiornaDisegno(){
     	 	
     	 	repaint ();//ogni volta che viene invocato aggiornaDisegno(),
                       //repaint richiama paintComponet di JPanel
     	 }
     	 
     	 /**metodo di JPanel sovrascritto da PannelloApplicazione
     	  */
     	  public void paintComponent (Graphics g){
     	  	
     	  	super.paintComponent (g); //per richiamare il metodo paintComponent
     	  	                         //della superclasse JPanel
     	  	
     	  	Graphics2D g2 = (Graphics2D) g;//con il cast recupero il riferimento
     	  	                               //a Graphics2D
     	  	
     	  	Random randomGenerator = new Random ();
     	  	
     	  	//disegno lo sfondo
     	  	int red = randomGenerator.nextInt(256);
     	  	int green = randomGenerator.nextInt(256);
     	  	int blue = randomGenerator.nextInt(256);
     	  	
     	  	g2.setColor(new Color(red, green, blue));
     	  	Rectangle sfondo = new Rectangle (0,0,800,800);
     	  	g2.fill(sfondo);
     	  	
     	  	//disegno le ellissi
     	  	g2.setColor (Color.black);
     	  	int diametro1 = 0;
     	  	int diametro2 =0;
     	  	int numeroEllissi = nE.getNumEllissi();
     	  	
     	  	for (int i=0; i<numeroEllissi; i++){
     	  		
     	  		//sceglie una posizione casuale per ogni ellisse
     	  		int xPosizione = randomGenerator.nextInt(601); 
     	  		int yPosizione = randomGenerator.nextInt(500);
     	  		
     	  		//sceglie per diametro1 un valore casuale tra 50 e 200
     	  		switch (randomGenerator.nextInt(2)){
     	  			case 0:
     	  				diametro1 = 50;
     	  				break;
    
     	  			case 1:
     	  				diametro1 = 200;
     	  				break;
     	  		}
    
     	  		//sceglie per diametro2 un valore casuale tra 50 e 200
     	  		switch (randomGenerator.nextInt(2)){
     	  			case 0:
     	  				diametro2 = 50;
     	  				break;
    
     	  			case 1:
     	  				diametro2 = 200;
     	  				break;
     	  		}
     	  		
     	  		g2.drawOval(xPosizione, yPosizione, diametro1, diametro2);  		
     	  		
     	  	}//fine ciclo for
     	  	                              
     	  }//fine paintComponet
     	
     }//qui finisce la classe PannelloApplicazione

  2. #2
    Moderatore di JavaScript L'avatar di br1
    Registrato dal
    Jul 1999
    Messaggi
    19,998
    La prima cosa da imparare e' la differenza fra Java e JavaScript... ti sposto
    Il guaio per i poveri computers e' che sono gli uomini a comandarli.

    Attenzione ai titoli delle discussioni: (ri)leggete il regolamento
    Consultate la discussione in rilievo: script / discussioni utili
    Usate la funzione di Ricerca del Forum

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Originariamente inviato da br1
    La prima cosa da imparare e' la differenza fra Java e JavaScript... ti sposto
    La seconda è che quando si posta del codice, si devono usare i tag CODE, altrimenti va a farsi benedire sia la formattazione che l'indentazione, utili per poter comprendere il codice stesso.

    Li aggiungo io.


    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

  4. #4
    grazie a tutti ma è la prima volta che utilizzo un forum

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    PS: se tu inibissi il "repaint" quando sposti o abbassi la finestra... questa, semplicemente, non verrebbe "ridisegnata" allo spostamento / ripristino (o meglio, non verrebbe ridisegnato il pannello con le ellissi). Quindi non vedresti affatto il pannello con le ellisi, ma un bel buco vuoto.

    Supponiamo che tu sovrapponga alla tua finestra, la finestra di un altro programma... quando sposti la finestra dell'altro programma (o la chiudi), la tua finestra Java dovrebbe ridisegnarsi... altrimenti non la vedresti più sullo schermo.

    Quindi, mi sa che devi rivedere un po' quelli che sono i concetti di "ridisegno".

    Se il tuo "scopo" è solo quello di evitare il ridisegno delle ellissi, allora puoi impostare una variabile booleana che verrà valorizzata a "true" solo quando sarà necessario disegnarle e a false immediatamente dopo. L'intero corpo del paintComponent dovrebbe essere sottoposto alla condizione che tale variabile sia a "true". Ma attenzione: questo comporta anche il fatto che se la finestra viene ridotta a icona o sovrastata da un'altra finestra, le ellissi verranno irrimediabilmente cancellate.


    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
    In realtà dovrei cercare di memorizzare le posizioni e dimensioni random delle ellissi in un array bidimensionale(magari in un altro metodo), tutto questo fuori dal paintComponent.Il problema è che poi non saprei come accedere dal paintComponent alle posizioni dell'array.
    Spero di essere riuscita a spiegarmi bene...

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.