AWT, cambiare un disegno, RE DRAW

di il
6 risposte

AWT, cambiare un disegno, RE DRAW

Salve,
Volevo chiederVi come si potrebbe cambiare un disegno, fatto attraverso AWT, con uno nuovo.
Il codice è il seguente:

1) Creo una classe "Figure", che mi disegna un quadrato:

import java.awt.Graphics;

import javax.swing.JComponent;

public class Figure extends JComponent{

	Figure(){
		System.out.println("Figure istanziato");
	}
	
	  public void paint(Graphics g) {
		    g.drawRect (10, 10, 200, 200);
		  }
}
2) Creo una classe "GUI" che, dopo aver istanziato "Figure", mi produce una finestra in cui applicare il disegno, nell'area "CENTER",di "BorderLayout", ed un bottone, nell'area "SOUTH", per cambiare la figura geometrica.

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;

public class Gui {

	Figure f;
	Gui(){
		System.out.println("G.U.I. istanziata");
		f = new Figure();
		
        JFrame frame = new JFrame("Grafica");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(450,450);
        frame.setVisible(true);
        
        JButton button = new JButton("Cambia");
        button.addActionListener(new ActionListener() {			
			@Override
			public void actionPerformed(ActionEvent e) {
				System.out.println("Cambia figura");
			}
        });
        
        frame.getContentPane().add(BorderLayout.CENTER, f);
        frame.getContentPane().add(BorderLayout.SOUTH, button);
        frame.repaint();
        frame.setVisible(true);
	}
}
3) La class "Main", infine, istanzia la classe "Gui":

public class Main {

	static Gui g;
	public static void main(String[] args) {
		g = new Gui();
	}
}
La mia domanda è, come potrei fare per cambiare la figura geometrica del quadrato con un cerchio?
g.drawOval(10, 10, 200, 200);

6 Risposte

  • Re: AWT, cambiare un disegno, RE DRAW

    Prova così:
    public class Gui {
    
       Figure f;
       static public boolean cerchio=false;; //<<<<<<<<<<<<<<<<<<<
       Gui(){
          System.out.println("G.U.I. istanziata");
          f = new Figure();
         
            JFrame frame = new JFrame("Grafica");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setSize(450,450);
            frame.setVisible(true);
           
            JButton button = new JButton("Cambia");
            button.addActionListener(new ActionListener() {         
             @Override
             public void actionPerformed(ActionEvent e) {
                System.out.println("Cambia figura");
                cerchio = ! cerchio;//<<<<<<<<<<<<<<<<<<<
                frame.repaint();//<<<<<<<<<<<<<<<<<<<
             }
            });
           
            frame.getContentPane().add(BorderLayout.CENTER, f);
            frame.getContentPane().add(BorderLayout.SOUTH, button);
            frame.repaint();
            frame.setVisible(true);
       }
    }
    
    public class Figure extends JComponent{
    
       Figure(){
          System.out.println("Figure istanziato");
       }
       
         public void paint(Graphics g) {
             if(Gui.cerchio == false) {
                g.drawRect (10, 10, 200, 200);
             }
             else {
                g.drawOval(10, 10, 200, 200);
             }        
        }
    }
  • Re: AWT, cambiare un disegno, RE DRAW

    La classe "Gui" istanzia "Figure", e non viceversa, quindi nella classe "Figure" non esiste l'oggetto "Gui":
    
    public class Figure extends JComponent{
    
       Figure(){
          System.out.println("Figure istanziato");
       }
       
         public void paint(Graphics g) {
             if(Gui.cerchio ==0) {
                g.drawRect (10, 10, 200, 200);
             }
             else {
                g.drawOval(10, 10, 200, 200);
             }       
        }
    }
    
  • Re: AWT, cambiare un disegno, RE DRAW

    Forse hai dimenticato
    static Gui g;
    a me funziona
  • Re: AWT, cambiare un disegno, RE DRAW

    Ho risolto creando una nuova classe, "Cerchio".

    I Sorgenti, quindi, sono i seguenti:

    1) Creo una classe "Quadrato":
    
    import java.awt.Graphics;
    
    import javax.swing.JComponent;
    
    public class Quadrato extends JComponent{
    	
    	   Quadrato(){
    		      System.out.println("Quadrato istanziato");
    		   }
    		   
    		     public void paint(Graphics g) {
    		          g.drawRect (10, 10, 200, 200);
    		        }
    }
    
    2) Creo una classe "Cerchio":
    
    import java.awt.Graphics;
    
    import javax.swing.JComponent;
    
    public class Cerchio extends JComponent{
    
    	   Cerchio(){
    		      System.out.println("Cerchio istanziato");
    		   }
    		   
    		     public void paint(Graphics g) {
    		    	 g.drawOval(10, 10, 200, 200);
    		        }
    }
    
    3) Creo una classe "Gui" che istanzia un oggetto "Quadrato" ed un oggetto "Cerchio". Al premere del bottone "Cambia", cancella l'oggetto "Quadrato", nel BorderLayout.Center, e ci aggiunge l'oggetto "Cerchio".
    
    import java.awt.BorderLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    
    public class Gui {
    
       Quadrato q;
       Cerchio c;
       
       Gui(){
          System.out.println("G.U.I. istanziata");
          q = new Quadrato();
          c = new Cerchio();
          
            JFrame frame = new JFrame("Grafica");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setSize(450,450);
            frame.setVisible(true);
           
            JButton button = new JButton("Cambia");
            button.addActionListener(new ActionListener() {         
             @Override
             public void actionPerformed(ActionEvent e) {
                System.out.println("Cambia figura");
                frame.getContentPane().remove(q);
                frame.getContentPane().add(BorderLayout.CENTER, c);
                frame.revalidate();
                frame.repaint();
             }
            });
           
            frame.getContentPane().add(BorderLayout.CENTER, q);
            frame.getContentPane().add(BorderLayout.SOUTH, button);
            frame.repaint();
            frame.setVisible(true);
       }
    }
    
    4) La classe "Main", infine, istanzia "Gui".
    
    public class Main {
    
    	static Gui g;
    	public static void main(String[] args) {
    		g = new Gui();
    	}
    }
    
    Sarebbe possibile fare ciò con una sola classe "Figure" ?
  • Re: AWT, cambiare un disegno, RE DRAW

    Il jar funzionante ti convincerebbe ?
  • Re: AWT, cambiare un disegno, RE DRAW

    Provato, funziona! Perchè il modificatore "static" rende la variabile globale.
    Grazie!

    Quindi il codice finale è:
    1) Classe "figure":
    
    import java.awt.Graphics;
    
    import javax.swing.JComponent;
    
    public class Figure extends JComponent{
    	
    	Figure(){
    	      System.out.println("Quadrato istanziato");
    	   }
    	   
    	     public void paint(Graphics g) {
    	    	 if(Gui.quadrato)
    	    		 g.drawRect (10, 10, 200, 200);
    	    	 else
    	    		 g.drawOval(10, 10, 200, 200);
    	        }
    	}
    
    2) La classe "Gui":
    
    import java.awt.BorderLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    
    public class Gui {
    	
    	static public boolean quadrato=true;
    	private Figure f;
    
       
       Gui(){
          System.out.println("G.U.I. istanziata");
          f = new Figure();
          
            JFrame frame = new JFrame("Grafica");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setSize(450,450);
            frame.setVisible(true);
           
            JButton button = new JButton("Cambia");
            button.addActionListener(new ActionListener() {         
             @Override
             public void actionPerformed(ActionEvent e) {
                System.out.println("Cambia figura");
                quadrato=!quadrato;
                frame.revalidate();
                frame.repaint();
             }
            });
           
            frame.getContentPane().add(BorderLayout.CENTER, f);
            frame.getContentPane().add(BorderLayout.SOUTH, button);
            frame.repaint();
            frame.setVisible(true);
       }
    }
    
    3) Ed infine la classe "Main":
    
    public class Main {
    
    	static Gui g;
    	public static void main(String[] args) {
    		g = new Gui();
    	}
    }
    
Devi accedere o registrarti per scrivere nel forum
6 risposte