Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    12

    Accedere ai metodi di un JComponent

    Salve a tutti ragazzi, mi chiamo Marco e sono nuovo sia del forum che di Java.
    Sto facendo degli esperimenti con Swing ed in particolare con la creazione di una classe che estende JComponent. Per ora sono riuscito a fare un disegno, un semplice quadrato, realizzato dal metodo paintComponent. Vorrei però dotare il componente di un metodo pubblico che realizzi un ulteriore disegno a posteriori, dietro una chimata esplicita. Ma qui ottengo un errore. Vi riporto il codice delle due mini-classi. Spero che mi possiate dire dove sto sbagliando.

    Grazie anticipatamante,

    Marco

    codice:
    import javax.swing.JComponent;
    
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Shape;
    import java.awt.Color;
    import java.awt.geom.Ellipse2D;
    
    import java.awt.geom.Rectangle2D;
    
    public class MyComponent extends JComponent{
    
    	private static final long serialVersionUID = 1L;
    	double latoQuadrato;
    	double diametroCerchio;
    	Graphics2D g2;
    	public MyComponent(){
    		latoQuadrato = 150.0;
    	}
    	 public void paintComponent(Graphics g)
    	   {  
    		  //disegna un quadrato
    		 	g2 = (Graphics2D) g;
    		 Shape quadrato = new Rectangle2D.Double(
    				  100,100,
    				  latoQuadrato,latoQuadrato);
    		 	g2.setPaint(Color.red);
    		    g2.draw(quadrato); 
    	   }
    	 
    	 public void drawCircle(float raggio){
    		 Shape circle = new Ellipse2D.Float(100.0f, 100.0f, raggio, raggio);
    		 g2.draw(circle);
    		 g2.setPaint(Color.green);
    		 g2.fill(circle);
    	 }
    	
    }
    
    import javax.swing.JFrame;
    
    
    public class DisegnaComponente {
    	public static void main(String args[]) {
    		JFrame frame = new JFrame();
    		frame.setSize(600, 600);
    		frame.setTitle("Prova nuovo componente");
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
    		MyComponent component = new MyComponent();
    // a questo punto provo un metodo pubblico 	
    // per disegnare un cerchio, ma non funziona...	
    		component.drawCircle(50.0f);
    		frame.add(component);
    		frame.setVisible(true);
    
    		}
    		}

  2. #2
    Credo che il metodo in questione sia drawCircle. Giusto?

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    12
    Esatto Vincenzo. Mi aspetterei di poter chiamare il metodo anche dall'esterno, visto che l'ho reso public.
    Ad esempio, vorrei poterlo eseguire da un pulsante che si trova nello stesso container che ospita il component.
    E' possibile secondo te?

    Marco

  4. #4
    Ho letto bene il codice e ci sono due cose che non vanno bene:
    in generale, per disegnare sul componente, devi utilizzare l'istanza di Graphics g che riceve paintComponent, qualsiasi cosa tu voglia disegnare.
    Quindi, DrawCircle non è corretto ed il campo di istanza g2 non serve.

    Per fare le cose correttamente potresti fare una cosa del genere:
    codice:
    /**
     * @(#)Tester.java
     *
     *
     * @author Vincenzo
     * @version 1.00 2011/2/13
     */
    
    import javax.swing.*;
    import java.awt.*;
    import java.awt.geom.Rectangle2D;
    import java.util.*;
    
    public class Tester extends JPanel{
    	
    	private LinkedList<Shape> shapes;
    	
        /**
         * Creates a new instance of <code>Tester</code>.
         */
        public Tester() {
        	this.shapes = new LinkedList<Shape>();
        }
        
        @Override
        public void paintComponent(Graphics g){
        	super.paintComponent(g);
        	for(Shape s : this.shapes){
        		((Graphics2D)g).draw( s );
        	}
        }
        
        public void disegnaQuadrato(Point p, int lato){
        	this.shapes.add( new Rectangle2D.Double(p.x,p.y,lato,lato) );
        }
        
        public static void startGUI(){
        	JFrame frame = new JFrame();
        	frame.setPreferredSize(new Dimension(500, 500));
        	Tester t = new Tester();
        	t.disegnaQuadrato(new Point(200, 200), 200);
        	t.disegnaQuadrato(new Point(150, 150), 100);
        	frame.add( t );
        	frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        	frame.pack();
        	frame.setVisible(true);    	
        }
        
        /**
         * @param args the command line arguments
         */
        public static void main(String[] args) {
            // TODO code application logic here
            SwingUtilities.invokeLater(
            	new Runnable(){
            		public void run(){
            			Tester.startGUI();
            		}
            	}
            );
        }
    }

  5. #5
    Originariamente inviato da marcos65
    Mi aspetterei di poter chiamare il metodo anche dall'esterno, visto che l'ho reso public.
    Ad esempio, vorrei poterlo eseguire da un pulsante che si trova nello stesso container che ospita il component.
    E' possibile secondo te?
    Certo Marco, puoi farlo benissimo

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    12
    Grazie mille Vincenzo,

    ora ci devo studiare su un po' per capire come modificare la mia vera applicazione seguendo il tuo modello.
    A proposito di studiare, avrei bisogno di un bel testo che spieghi come creare le GUI con Swing e gli eventi.

    Quale è secondo te il migliore libro sull'argomento?

    Marco

  7. #7
    Originariamente inviato da marcos65
    A proposito di studiare, avrei bisogno di un bel testo che spieghi come creare le GUI con Swing e gli eventi.

    Quale è secondo te il migliore libro sull'argomento?
    Penso che potresti cercare un buon libro in Java che parla anche di programmazione grafica e poi magari basarti anche sui manuali ed esempi ufficiali della Sun che sono in rete.

    Io per l'università ho utilizzato Big Java di Cay S.Horstmann e questo dedica 2 capitoli alla programmazione grafica.

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.