Visualizzazione dei risultati da 1 a 5 su 5

Discussione: Disegno in Java

  1. #1

    Disegno in Java

    Buonasera a tutti.

    Chiedo scusa a tutti anticipatamente in quanto farò sicuramente degli errori nella formulazione della richiesta, essendo questo il mio primo intervento.

    Il mio problema è che devo capire bene come diamine funzioni il disegno in Java...

    Il progetto che devo sviluppare riguarda la possibilità di disegnare (tramite input manuale, non necessariamente dal click del mouse):

    -linee
    -rettangoli
    -cerchi

    I problemi che presenta il codice che segue sono molteplici:

    1.Non riesco ancora bene a gestire l'inserimento delle coordinate dei punti che creano le tre figure sopracitate (linee, rettangoli, cerchi), ma questo è il problema minore, in qualche modo credo di riuscire a risolvere

    2.Posso tracciare una sola istanza per tipologia di disegno (non devo avere questo limite)

    3.La figura non compare subito, ma compare solo in seguito ad un ridmensionamento di FramePrincipale.


    Se già mi poteste dare una mano per risolvere questi problemi 2 e 3 vi sarei molto grato.

    Sicuramente sbaglio di fondo anche nel concepire diverse cose, criticatemi pure alla morte, son contento.



    Buona serata a tutti!

    P.s. (Non fateci caso, potrebbero esserci molti Import inutili, il codice è solo una prova)

    codice:
    //Import
    import javax.swing.Box;
    
    import java.awt.BorderLayout;
    import java.awt.Component;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.GridLayout;
    import java.awt.MenuShortcut;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JMenu;
    import javax.swing.JMenuBar;
    import javax.swing.JMenuItem;
    import javax.swing.JPanel;
    import javax.swing.JOptionPane;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.WindowEvent;
    import java.awt.event.WindowListener;
    //Codice
    import java.awt.image.BufferedImage;
    import java.io.FileOutputStream;
    import java.io.OutputStream;
    
    public class FramePrincipale {
    	static JFrame p; //Finestra principale
    	JMenuBar MenuBar; //Barra del menu principale
    	
    	//Menu File
    	
    	JMenu MenuFile;
    	JMenuItem Apri;
    	JMenuItem Nuovo;
    	MenuShortcut n;
    	JMenuItem Salva;
    	MenuShortcut s;
    	JMenuItem Esci;
    	
    	//Menu Edit
    	JMenu MenuEdit;
    	JMenuItem Annulla;
    	MenuShortcut r;
    	JMenuItem Ripristina;
    	
    	//Menu Disegno
    	JMenu MenuDisegno;
    	JMenuItem DisLinea;
    	JMenuItem DisRettangolo;
    	JMenuItem DisCerchio;
    	
    	//Menu Info
    	JMenu MenuHelp;
    	JMenuItem Info;
    	MenuShortcut i;
    	JMenuItem Help;
    	
    	static JPanel Disegno;
    	
    	static boolean esci,esci_ann;
    	static //coordinate per il disegno
    	int x;
    	static int y;
    	static int lxdx=100;
    	static int lxsx=0;
    	static int lydx=100;
    	static int lysx=0;
    	static int[] coo_linea_x;
    	static int[] coo_linea_y;
    	static int[] coo_rett_x;
    	static int[] coo_rett_y;
    	static int[] coo_cerchio_x;
    	static int[] coo_cerchio_y;
    		
    	public FramePrincipale(){
    		//Creazione delle istanze
    		coo_linea_x=new int[2];
    		coo_linea_y=new int[2];
    		coo_rett_x=new int[2];
    		coo_rett_y=new int[2];
    		coo_cerchio_x=new int[2];
    		coo_cerchio_y=new int[2];
    		//frame principale
    		p=new JFrame();
    		//Barra dei menu
    		MenuBar=new JMenuBar();
    		
    		//Menu "File"
    		Apri= new JMenuItem("Apri");
    		Apri.addActionListener(new AscoltatoreMenu());
    		Nuovo=new JMenuItem("Nuovo");
    		Nuovo.addActionListener(new AscoltatoreMenu());
    		Salva=new JMenuItem("Salva");
    		Salva.addActionListener(new AscoltatoreMenu());
    		Esci=new JMenuItem("Esci");
    		Esci.addActionListener(new AscoltatoreMenu());
    		MenuFile=new JMenu("File");
    		
    		//Menu "Edit"
    		Annulla=new JMenuItem("Annulla");
    		Annulla.addActionListener(new AscoltatoreMenu());
    		Ripristina=new JMenuItem("Ripristina");
    		Ripristina.addActionListener(new AscoltatoreMenu());
    		MenuEdit=new JMenu("Edit");
    		
    		//Menu "Disegno"
    		
    		DisLinea = new JMenuItem("Linea");
    		DisLinea.addActionListener(new AscoltatoreMenu());
    		DisRettangolo = new JMenuItem("Rettangolo");
    		DisRettangolo.addActionListener(new AscoltatoreMenu());
    		DisCerchio = new JMenuItem("Cerchio");
    		DisCerchio.addActionListener(new AscoltatoreMenu());
    		MenuDisegno = new JMenu("Disegno");
    		
    		//Menu "Info"
    		
    		Info=new JMenuItem("Info");
    		Info.addActionListener(new AscoltatoreMenu());
    		Help=new JMenuItem("Help");
    		Help.addActionListener(new AscoltatoreMenu());
    		MenuHelp=new JMenu("?");
    		//Pannello di disegno
    		Disegno=new JPanel();
    		
    		//----------------
    		
    		//Setup Menu
    		MenuFile.add(Apri);
    		MenuFile.add(Nuovo);
    		MenuFile.add(Salva);
    		MenuFile.add(Esci);
    		MenuBar.add(MenuFile);
    		MenuEdit.add(Annulla);
    		MenuEdit.add(Ripristina);
    		MenuBar.add(MenuEdit);
    		MenuHelp.add(Info);
    		MenuHelp.add(Help);
    		MenuBar.add(MenuDisegno);
    		MenuDisegno.add(DisLinea);
    		MenuDisegno.add(DisRettangolo);
    		MenuDisegno.add(DisCerchio);
    		
    		//sposta il menu "Help" sulla destra
    		MenuBar.add(Box.createHorizontalGlue());
    		MenuBar.add(MenuHelp);
    		p.setJMenuBar(MenuBar);
    				
    		//Setup di tutto il resto
    		p.pack();
    		p.setVisible(true);
    		p.setSize(200,200);
    		p.setLayout(new BorderLayout());
    		p.add(Disegno);
    		Disegno.setSize(200,200);
    		Disegno.setVisible(true);
    		
    	    		
    	    //--------------------
    		
    	    //Ascoltatore del Frame principale
    	    class AscoltatoreFinestra implements WindowListener{
    	    	public void windowClosing (WindowEvent we){
    	    		System.exit(0);	}
    	    	public void windowClosed (WindowEvent we){};
    	    	public void windowOpened (WindowEvent we){};
    	    	public void windowActivated (WindowEvent we){};
    	    	public void windowDeactivated (WindowEvent we){};
    	    	public void windowIconified (WindowEvent we){};
    	    	public void windowDeiconified (WindowEvent we){};
    	    };
    	    p.addWindowListener (new AscoltatoreFinestra());
    	    
    		}
    	
    		
    		//Ascoltatore del Menu del Frame Principale
    		class AscoltatoreMenu implements ActionListener{
    			public void actionPerformed (ActionEvent ae){
    				switch (ae.getActionCommand()){
    				case "Apri": /*da metterci qualcosa!*/ ; break;
    				case "Nuovo": /*da metterci qualcosa!*/ ; break;
    				case "Salva": /*da metterci qualcosa!*/ ; break;
    				case "Esci": System.exit(0); break;
    				case "Annulla": /*da metterci qualcosa!*/ ; break;
    				case "Ripristina": /*da metterci qualcosa!*/ ; break;
    				case "Linea": {
    					Disegno_linea();
    					break;
    				}
    				case "Rettangolo": {
    					Disegno_rettangolo();
    					break;
    				}
    				case "Cerchio": {
    					Disegno_cerchio();
    					break;
    				}
    				case "Info": {
    					  JOptionPane.showMessageDialog (p,"Progetto di Davide Caprari","Programmazione da Oggetti",JOptionPane.INFORMATION_MESSAGE);
    				}; break;
    				case "Help": /*da metterci qualcosa!*/ ; break;
    				}
    			}
    			
    		}
    			
    		public static void Disegno_linea(){
    			
    		//InserimentoCoordinate per la linea	
    			for (int i=0;i<2;i++){
    				esci=false;
    				esci_ann=false;	
    			do{
    				try{
    				x = Integer.parseInt((JOptionPane.showInputDialog ("Dammi la coordinata x del punto "+(i+1)+" (tra "+lxsx+" e "+lxdx+")")));
    				esci=false;
    				} catch (NumberFormatException e){
    							if (e.getMessage()=="null"){esci_ann=true;break;}
    							else{
    							JOptionPane.showMessageDialog (null,"Devi inserire un numero compreso tra "+lxsx+" e "+lxdx,"Errore",JOptionPane.WARNING_MESSAGE);
    							};
    				}
    				finally{
    					if (x>=lxsx & x<=lxdx){esci=true;}
    					else {
    						 esci=false;
    						 JOptionPane.showMessageDialog (null,"Devi inserire un numero compreso tra "+lxsx+" e "+lxdx,"Errore",JOptionPane.WARNING_MESSAGE);
    							 }
    						 }
    					}
    				while(esci==false);
    			coo_linea_x[i]=x;
    			if (esci_ann==false){
    			do{
    				try{
    				y = Integer.parseInt((JOptionPane.showInputDialog ("Dammi la coordinata y del punto "+(i+1)+" (tra "+lysx+" e "+lydx+")")));
    				esci=false;
    				} catch (NumberFormatException e){
    							if (e.getMessage()=="null"){esci_ann=true;break;}
    							else{
    							JOptionPane.showMessageDialog (null,"Devi inserire un numero compreso tra "+lysx+" e "+lydx,"Errore",JOptionPane.WARNING_MESSAGE);
    							}
    					}
    				finally{
    					if (y>=lysx & y<=lydx){esci=true;}
    					else {
    						 esci=false;
    						 JOptionPane.showMessageDialog (null,"Devi inserire un numero compreso tra "+lysx+" e "+lydx,"Errore",JOptionPane.WARNING_MESSAGE);
    							 }
    						 }
    					   }
    				while(esci==false);
    			  coo_linea_y[i]=y;}
    			else{break;}
    			if(esci_ann){break;}
    			}
    		//proiezione punti sul JPanel(Disegno)
    		class DisegnoLinea extends JPanel{
    			public void paintComponent(Graphics g){
    				g.drawLine(coo_linea_x[0],coo_linea_y[0],coo_linea_x[1],coo_linea_y[1]);
    				}
    		}
    		DisegnoLinea linea=new DisegnoLinea();
    		p.add(linea);
    		Disegno.repaint();
    		}
    	
    			public static void Disegno_rettangolo(){
    				
    			//Inserimento coordinate per rettangolo	
    				
    				for (int i=0;i<2;i++){
    					esci=false;
    					esci_ann=false;
    				do{
    					try{
    					x = Integer.parseInt((JOptionPane.showInputDialog ("Dammi la coordinata x dello spigolo "+(i+1)+" (tra "+lxsx+" e "+lxdx+")")));
    					esci=false;
    					} catch (NumberFormatException e){
    								if (e.getMessage()=="null"){esci_ann=true;break;}
    								else{
    								JOptionPane.showMessageDialog (null,"Devi inserire un numero compreso tra "+lxsx+" e "+lxdx,"Errore",JOptionPane.WARNING_MESSAGE);
    								}
    						}
    					   catch (Exception e){
    						   System.out.println("Oh yes");
    					   }
    					finally{
    						if (x>=lxsx & x<=lxdx){esci=true;}
    						else {
    							 esci=false;
    							 JOptionPane.showMessageDialog (null,"Devi inserire un numero compreso tra "+lxsx+" e "+lxdx,"Errore",JOptionPane.WARNING_MESSAGE);
    								 }
    							 }
    					}
    					while(esci==false);
    				coo_rett_x[i]=x;
    				if (esci_ann==false){
    				do{
    					try{
    					y = Integer.parseInt((JOptionPane.showInputDialog ("Dammi la coordinata y dello spigolo "+(i+1)+" (tra "+lysx+" e "+lydx+")")));
    					esci=false;
    					} catch (NumberFormatException e){
    								if (e.getMessage()=="null"){esci_ann=true;break;}
    								else{
    								JOptionPane.showMessageDialog (null,"Devi inserire un numero compreso tra "+lysx+" e "+lydx,"Errore",JOptionPane.WARNING_MESSAGE);
    								}
    						}
    					finally{
    						if (y>=lysx & y<=lydx){esci=true;}
    						else {
    							 esci=false;
    							 JOptionPane.showMessageDialog (null,"Devi inserire un numero compreso tra "+lysx+" e "+lydx,"Errore",JOptionPane.WARNING_MESSAGE);
    								 }
    							 }
    						   }
    						
    					while(esci==false);
    				  coo_rett_y[i]=y;}
    				else{break;}
    				if(esci_ann){break;}
    				}
    				//proiezione punti sul JPanel(Disegno)
    				class DisegnoRettangolo extends JPanel{
    					public void paintComponent(Graphics g){
    						g.drawRect(coo_rett_x[0],coo_rett_y[0],coo_rett_x[1],coo_rett_y[1]);
    						}
    				}
    				DisegnoRettangolo rettangolo=new DisegnoRettangolo();
    				Disegno.add(rettangolo);
    				}
    Davide

    www.facebook.com/davidecaprari89

  2. #2
    codice:
    		
    			public static void Disegno_cerchio(){
    				
    				//InserimentoCoordinate per il cerchio	
    					for (int i=0;i<2;i++){
    						esci=false;
    						esci_ann=false;	
    					do{
    						try{
    						x = Integer.parseInt((JOptionPane.showInputDialog ("Dammi la coordinata x del punto "+(i+1)+" (tra "+lxsx+" e "+lxdx+")")));
    						esci=false;
    						} catch (NumberFormatException e){
    									if (e.getMessage()=="null"){esci_ann=true;break;}
    									else{
    									JOptionPane.showMessageDialog (null,"Devi inserire un numero compreso tra "+lxsx+" e "+lxdx,"Errore",JOptionPane.WARNING_MESSAGE);
    									};
    						}
    						finally{
    							if (x>=lxsx & x<=lxdx){esci=true;}
    							else {
    								 esci=false;
    								 JOptionPane.showMessageDialog (null,"Devi inserire un numero compreso tra "+lxsx+" e "+lxdx,"Errore",JOptionPane.WARNING_MESSAGE);
    									 }
    								 }
    							}
    						while(esci==false);
    					coo_cerchio_x[i]=x;
    					if (esci_ann==false){
    					do{
    						try{
    						y = Integer.parseInt((JOptionPane.showInputDialog ("Dammi la coordinata y del punto "+(i+1)+" (tra "+lysx+" e "+lydx+")")));
    						esci=false;
    						} catch (NumberFormatException e){
    									if (e.getMessage()=="null"){esci_ann=true;break;}
    									else{
    									JOptionPane.showMessageDialog (null,"Devi inserire un numero compreso tra "+lysx+" e "+lydx,"Errore",JOptionPane.WARNING_MESSAGE);
    									}
    							}
    						finally{
    							if (y>=lysx & y<=lydx){esci=true;}
    							else {
    								 esci=false;
    								 JOptionPane.showMessageDialog (null,"Devi inserire un numero compreso tra "+lysx+" e "+lydx,"Errore",JOptionPane.WARNING_MESSAGE);
    									 }
    								 }
    							   }
    						while(esci==false);
    					  coo_cerchio_y[i]=y;}
    					else{break;}
    					if(esci_ann){break;}
    					}
    				//proiezione punti sul JPanel(Disegno)
    				class DisegnoCerchio extends JPanel{
    					public void paintComponent(Graphics g){
    						int raggio=(int) Math.sqrt(Math.pow(coo_cerchio_x[1]-coo_cerchio_x[0],2)+Math.pow(coo_cerchio_y[1]-coo_cerchio_y[0],2));
    						g.drawOval(coo_cerchio_x[0],coo_cerchio_y[0],raggio,raggio);
    						}
    				}
    				DisegnoCerchio cerchio=new DisegnoCerchio();
    				Disegno.add(cerchio);
    				}
    	//MAIN
    	public static void main(String[] args){
    	new FramePrincipale();
    	}
    }
    Davide

    www.facebook.com/davidecaprari89

  3. #3
    Qualcuno può darmi una mano cortesemente?
    Davide

    www.facebook.com/davidecaprari89

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

    Re: Disegno in Java

    Originariamente inviato da caprasklero
    1.Non riesco ancora bene a gestire l'inserimento delle coordinate dei punti che creano le tre figure sopracitate (linee, rettangoli, cerchi), ma questo è il problema minore, in qualche modo credo di riuscire a risolvere

    2.Posso tracciare una sola istanza per tipologia di disegno (non devo avere questo limite)

    3.La figura non compare subito, ma compare solo in seguito ad un ridmensionamento di FramePrincipale.
    L'approccio che hai seguito è comunque parecchio fumoso e poco sensato.
    Le possibilità in genere sono due:
    1) ogni figura viene rappresentata da un componente a sé stante ed avrai quindi N componenti contenuti in un Container.
    oppure
    2) un solo componente che disegna sulla sua superficie più figure in tipi e quantità che possono anche essere arbitrarie. In tal caso per "accumulare" più figure si può sfruttare una struttura dati e/o (quindi anche insieme eventualmente) una immagine off-screen di buffer da disegnare poi sul Graphics del componente.

    Ognuna delle due soluzioni ha pro e contro.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Sono più propenso di fatti a seguire la seconda delle strade che hai indicato...

    Ma dov'è l'errore che ho commesso nel codice??

    Perché non riesco a disegnare una linea sul JPanel Disegno, inserito all'interno di FramePrincipale?

    Una label, ad esempio, riesco a visualizzarla...ma per qualsiasi forma di disegno non c'è niente da fare!!

    Se invece provo, ad esempio, a fare

    codice:
    p.add(rettangolo)
    visualizza il disegno "senza problemi".
    L'unico problema che persiste è che non mi disegna il rettangolo finché ridimensiono la finestra...neanche se faccio


    codice:
    p.add(rettangolo)
    p.repaint()
    Aiutatemi per piacere!
    Davide

    www.facebook.com/davidecaprari89

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.