Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2001
    Messaggi
    89

    [JAVA] Aggiunta di un pulsante

    Ciao a tutti,
    sono alle prime armi con java e mi stavo divertendo a personallizare un esercizio trovato sempre online.
    Si tratta di una specie di lavagna che tenendo premuto il tasto del mouse scrve sul JPanel.
    Naturalmente finn quì tutto ok... anche perchè il codice è copiato dall'esempio....
    Questo è l'esempio:


    codice:
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.JFrame.*;
    
    
    public class Painter extends JPanel {
      private int startXPoint = 0; // coordinata x di partenza
      private int endXPoint = 0; // coordinata x di arrivo
      private int startYPoint = 0; // coordinata y di partenza
      private int endYPoint = 0; // coordinata y di
      boolean paint = false;
    
      //ascoltatore del moto del mouse
      class mMotionListener implements MouseMotionListener {
        public void mouseDragged(MouseEvent e) {
          //aggiorna le coordinate
          startXPoint = endXPoint;
          startYPoint = endYPoint;
          endXPoint = e.getX();
          endYPoint = e.getY();
          //disegna
          Painter.this.repaint();
        }
    
        public void mouseMoved(MouseEvent e) {
          // aggiorna le coordinate
          startXPoint = endXPoint;
          startYPoint = endYPoint;
          endXPoint = e.getX();
          endYPoint = e.getY();
        }
      }
    
    // ascoltatore dei pulsanti del mouse
      class mListener implements MouseListener {
    
        // i seguenti metodi sono richiesti dalla
        // interfaccia MouseListener anche se non
        // vengono utilizzati
    
        public void mouseClicked(MouseEvent e) {}
    
        public void mouseEntered(MouseEvent e) {}
    
        public void mouseExited(MouseEvent e) {}
    
        public void mouseReleased(MouseEvent e) {}
    
        // pulsante premuto
        public void mousePressed(MouseEvent e) {
          //attiva la modalità di disegno
          paint = true;
        }
    
        // pulsante rilasciato
        public void MouseReleased(MouseEvent e) {
          // disattiva la modalità di  disegno
          paint = false;
        }
      }
    
      // Costruttore della classe principale
      public Painter() {
        super();
        MouseListener ml = new mListener();
        addMouseListener(ml);
        MouseMotionListener mml = new mMotionListener();
        addMouseMotionListener(mml);
      }
    
      public void paint(Graphics g) {
        // se è attiva la modalòità disegno, traccia una riga
        if (paint) {
          g.drawLine(startXPoint,startYPoint,endXPoint,endYPoint);
        }
      }
      public static void main(String argv[]) {
        Painter p = new Painter();
        JFrame f = new JFrame("Mia Prova Lavagna");
    
        f.getContentPane().add(p);
        f.setSize(500, 400);
        f.setVisible(true);
      }
    
    }

    dicevo tutto bene.. fino a quando non ho deciso...
    cerco di imparare qualcosa personalizzandolo...
    La mia idea era.. di creare un tasto che dopo averlo premuto mi cancella il tratto come una gomma sempre al passaggio del mouse...

    Quindi ho aggiunto un pulsante... in questo modo....


    codice:
     
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.JFrame.*;
    
    
    public class Painter extends JPanel {
      private int startXPoint = 0; // coordinata x di partenza
      private int endXPoint = 0; // coordinata x di arrivo
      private int startYPoint = 0; // coordinata y di partenza
      private int endYPoint = 0; // coordinata y di
      boolean paint = false;
    
      //ascoltatore del moto del mouse
      class mMotionListener implements MouseMotionListener {
        public void mouseDragged(MouseEvent e) {
          //aggiorna le coordinate
          startXPoint = endXPoint;
          startYPoint = endYPoint;
          endXPoint = e.getX();
          endYPoint = e.getY();
          //disegna
          Painter.this.repaint();
        }
    
        public void mouseMoved(MouseEvent e) {
          // aggiorna le coordinate
          startXPoint = endXPoint;
          startYPoint = endYPoint;
          endXPoint = e.getX();
          endYPoint = e.getY();
        }
      }
    
    // ascoltatore dei pulsanti del mouse
      class mListener implements MouseListener {
    
        // i seguenti metodi sono richiesti dalla
        // interfaccia MouseListener anche se non
        // vengono utilizzati
    
        public void mouseClicked(MouseEvent e) {}
    
        public void mouseEntered(MouseEvent e) {}
    
        public void mouseExited(MouseEvent e) {}
    
        public void mouseReleased(MouseEvent e) {}
    
        // pulsante premuto
        public void mousePressed(MouseEvent e) {
          //attiva la modalità di disegno
          paint = true;
        }
    
        // pulsante rilasciato
        public void MouseReleased(MouseEvent e) {
          // disattiva la modalità di  disegno
          paint = false;
        }
      }
    
      // Costruttore della classe principale
    
      public Painter() {
        super();
        MouseListener ml = new mListener();
        addMouseListener(ml);
        MouseMotionListener mml = new mMotionListener();
        addMouseMotionListener(mml);
      }
    
      public void paint(Graphics g) {
        // se è attiva la modalòità disegno, traccia una riga
        if (paint) {
          g.drawLine(startXPoint,startYPoint,endXPoint,endYPoint);
        }
      }
    
    
    
    
    
    
      public static void main(String argv[]) {
        Painter p = new Painter();
        JFrame f = new JFrame("Mia Prova Lavagna");
    
    
        ///************** AGGIUNTO DA MEEEEEEEEE ***************///
    
        JButton pulsante = new JButton("Cancella");
        f.getContentPane().setLayout(new BorderLayout());
        f.getContentPane().add((p), BorderLayout.NORTH);
        f.getContentPane().add((p), BorderLayout.EAST);
        f.getContentPane().add((p), BorderLayout.WEST);
        f.getContentPane().add((p), BorderLayout.CENTER);
        f.getContentPane().add((pulsante), BorderLayout.SOUTH);
        f.pack();
    
        ///************************************************///
    
        //f.getContentPane().add(p);
    
    
        f.setSize(500, 400);
        f.setVisible(true);
      }
    
    }

    e diciamo che già solo questo mi dà un pò di problemi visto che una volta premuto il pulsante cancella e ritorno sulla lavagna sopra in alto mi compare un'altro pulsante.
    Naturalmente quest'ultimo pulsante non è proprio un pulsante ma una dovrebbe essere una copia fotografica del punto in cui è passato il mouse.
    Vabbè... questo ne sono consapevole... .anche se non ho presente qual'è la soluzione.
    Quello che mi interessa proprio di più è come aggiungere un metodo che mi possa cambiare il metodo

    g.drawLine(startXPoint,startYPoint,endXPoint,endYP oint);

    in uno che mi cancella.... sempre se così che si faccia.... e se sono nella direzione giusta...


    Confido in un vostro aiuto...
    grazie
    Ciao Giuseppe R.
    "Nella vita non si è mai fermi o si va avanti o... si va indietro"

  2. #2
    Hai provato a prendere le coordinate del punto su cui passa la tua gomma-mouse e a disegnare un punto dello stesso colore dello sfondo?
    L'effetto è uguale alla cancellazione di quel punto.

    Al posto di un punto potresti disegnare un cerchio, un ovale, un rettangolo, un quadrato, ecc. centrato nel punto su cio è passato il mouse.
    ..::200 post il 1 settembre 2004::..
    ..::100 13/07/2004::..
    ..): Web Site (pazienza però) ..
    VASCO castiga chi non lecca la FIGA

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2001
    Messaggi
    89

    Ciao kateetak

    grazie mille della risposta...
    Ma non saprei da dove iniziare... o per lo meno, come faccio a fare ciò?
    La mia idea... e che vorrei solo creare un azione ogni volta che premo il pulsante cancella....
    secondo te cambiando questo metodo
    g.clearRect(10,10,10,10);
    al posto del mio
    g.drawLine(startXPoint,startYPoint,endXPoint,endYP oint);
    non dovrebbe cancellare ciò che ho scritto?
    Pensiate che sia possibile.. fare qualcosa del genere o sono propriuo fuori strada?
    "Nella vita non si è mai fermi o si va avanti o... si va indietro"

  4. #4
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    Io farei cosi:

    premendo il pulsante 'cancella' è come se selezionassi lo strumento 'gomma' passando dalla modalità di disegno alla modalità di cancellazione, nella quale devi cancellare il disegno. Il metodo seguito è quello appunto proposto da te, ovvero utilizzare l'istruzione

    g. drawLine(startXPoint,startYPoint,endXPoint, endYPoint);


    pero per ottenere la cancellazione è necessario che il colore con cui avviene il disegno sia il colore di background del pannello su cui disegni.

    Quindi io metteri due pulsanti:

    1 - un pulsante 'pennello' per disegnare, e quando viene premuto
    imposta il colore di disegno a 'nero' per esempio.

    2 - un pulsante 'gomma' per cancellare, e quando viene premuto
    imposta il colore di disegno uguale al background del pannello.

    Infine, per raffinare la cosa, magari quando cancelli dovresi cancellare qlcosa in piu di una linea, cioè una linea piu spezza.


  5. #5
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    Ho voluto provare il codice per capire perkè compariva quel pulsante in piu e ho corretto un po di errori.

    Innanzitutto il metodo MouseReleased con cui interrompi la modalità di disegno mettendo a false paint, dovrebbe esser chiamato mouseReleased, che invece hai lasciato vuoto, ma il disegno funziona lo stessso perche tanto avviene solo durante il trascinamento del mouse.

    Comuqnue, facendo delle prove ho capito che il problema del doppio pulsante dipendeva dalla ridefinizione del metodo paint(). Innanzitutto ricordo che per le operazioni di disegno bisognava usare paintComponente e non paint. Questo metodo serve anche a disegnare corretamente i componenti, quindi quando lo si ridefinisce bisogna farlo in modo corretto se no le cose non funzionano; se non sbaglio è necessario richiamare il metodo paintComponent della superclasse (cioè di JPanel in questo caso), in modo che faccia le sue operazioni di disegno, e poi fare il disegno che si vuole sul pannello. In questo modo però, richiamando il metodo piantComponent della superclasse si cancella tutto cio che è gia disegnato sul pannello, quindi sarebbe visibile solo l'ultimo tratto appena disegnato. In effetti ciò è giusto, perchè il metofo paintComponent (o paint) deve essere in grado di effettuare il diegno completo in tutte le sue parti, cioè ogni volta che viene richiamato deve ridisegnare tutte le linee fin lì disegnate, e non solo l'ultimo tratto. In effetti con il metodo che usavi tu nel tuo codice, potevi notare che se la finestra andava in secondo piano e poi la riportavi in primo piano, le linee fatte venivano perse perchè il metodo paint non sa come ridisegnarle.

    Il modo giusto di fare la cosa consiste nel ricordarti i tratti di lineaa via via disegnati, ad esempio aggiungendo i punti iniziale e finale di ogni tratto in un vettore traits; quindi il metodo paintComponent deve ogni volta ridisegnare tutti i tratti, prendendoli uno ad uno dal vettore traits.

    A tale scopo ho definito una classe Trait che contiene semmplicemente le coordinate del punto iniziale e finale di un tratto di linea.

    codice:
    	class Trait{
    	
    		public int startXPoint = 0;
    		public int startYPoint = 0;
    		public int endXPoint = 0;
    		public int endYPoint = 0;
    		
    		public Trait(int x1, int y1, int x2, int y2){
    			startXPoint = x1;
    			startYPoint = y1;
    			endXPoint = x2;
    			endYPoint = y2;
    		}
    	}

    Quindi l'evento di MouseDragged deve essere gestito creando un nuovo tratto con le coordinate iniziali e finali e aggiungendolo al vettore traits, prima di invocare repaint().

    codice:
    public void mouseDragged(MouseEvent e) {
        //aggiorna le coordinate
        startXPoint = endXPoint;
        startYPoint = endYPoint;
        endXPoint = e.getX();
        endYPoint = e.getY();  
        traits.add(new Trait(startXPoint, startYPoint, endXPoint, endYPoint));
         //disegna
          repaint();
    }
    Il metodo paintComponent da parte sua si scorrerà tutto il vettore dei tratti e li disegnerà uno ad uno.

    codice:
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        //Il disegno va rieptuto sempre
        Trait t = null;
        //disegno tutti i tratti
        for(int i = 0; i < traits.size(); i++){
    	t = (Trait)traits.get(i);
    	g.drawLine(t.startXPoint, t.startYPoint, t.endXPoint, t.endYPoint);
        }
    }
    Per cancellare in un colpo tutto il disegno è sufficiente svuotare tutto il vettore traits. La variabile booleana paint non è piu quindi necessaria perche come ho detto il disegno deve avvenire sempre, e inoltre i tratti sono aggiunti solo nell'evento MouseDragged.

    Ora puoi usare come base la mia versione del programma per implementare la cancellazione. L'idea è quella che ti ho suggerito nel post precedente; in particolare ho definito una variabile booleana draw che è true se si è nella modalità di disegno ed è false se si è nella modalità di cancellazione (il suo uso è diverso dall'uso che facevi della variabile paint!); questa variabile viene settata a true cliccando sul pulstante draw e a false cliccando sul pulsante delete. In particolare per cancellare bisognerebbe settare il colore di disegno col colore di sfondo, mentre per riprendere a disegnare bisogna impostarlo nuovamente su un altro colore. Questa informazione la includerei nella classe Trait, che dovrebbe quindi avere un riferimento ad un oggetto Color. Quindi se la modalità è quella di disegno crei un tratto col colore nero, altrimetni un tratto col colore di background e lo aggiungi al vetore traits. Il metodo paintComponent quindi deve semplicemente scorrere il vettore dei tratti, e per ognuno, effettuare il disegno col relativo colore incluso nel tratto.

    Ecco il codice aggiustato:

    codice:
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.JFrame.*;
    import java.util.*;
    
    
    class Painter extends JPanel {
    	private int startXPoint = 0; // coordinata x di partenza
      	private int endXPoint = 0; // coordinata x di arrivo
    	private int startYPoint = 0; // coordinata y di partenza
    	private int endYPoint = 0; // coordinata y di
    
    	//vale true se disegno, false se cancello
    	boolean draw = true;
    
      	//vettore che mantiene la lista dei tratti di disegno
      	private Vector traits;
    
    
    	//Classe per rappresentare un tratto di disegno
    	class Trait{
    	
    		public int startXPoint = 0;
    		public int startYPoint = 0;
    		public int endXPoint = 0;
    		public int endYPoint = 0;
    		
    		public Trait(int x1, int y1, int x2, int y2){
    			startXPoint = x1;
    			startYPoint = y1;
    			endXPoint = x2;
    			endYPoint = y2;
    		}
    	}
    	
    	
      	//ascoltatore del moto del mouse
      	class mMotionListener implements MouseMotionListener {
    
        public void mouseDragged(MouseEvent e) {
        	//aggiorna le coordinate
          	startXPoint = endXPoint;
          	startYPoint = endYPoint;
          	endXPoint = e.getX();
          	endYPoint = e.getY();
          
          	traits.add(new Trait(startXPoint, startYPoint, endXPoint, endYPoint));
          
          	//disegna
          	repaint();
        }
    
        public void mouseMoved(MouseEvent e) {
        	// aggiorna le coordinate
          	startXPoint = endXPoint;
          	startYPoint = endYPoint;
          	endXPoint = e.getX();
          	endYPoint = e.getY();
          	//traits.add(new Trait(startXPoint, startYPoint, endXPoint, endYPoint));
        }
        
    }
    
    
    	// ascoltatore dei pulsanti del mouse
    	class mListener implements MouseListener {
    
        	// i seguenti metodi sono richiesti dalla
        	// interfaccia MouseListener anche se non
        	// vengono utilizzati
    
        	public void mouseClicked(MouseEvent e) {}
    	
        	public void mouseEntered(MouseEvent e) {}
    	
        	public void mouseExited(MouseEvent e) {}
    
    
        	// pulsante premuto
        	public void mousePressed(MouseEvent e) {
    
        	}
    
        	// pulsante rilasciato
       		public void mouseReleased(MouseEvent e) {
    
        }
     }
    
    
    	// Costruttore della classe principale
    	public Painter() {
        	super();
        	MouseListener ml = new mListener();
        	addMouseListener(ml);
        	MouseMotionListener mml = new mMotionListener();
        	addMouseMotionListener(mml);
        	
        	traits = new Vector();
      	}
    
      	public void paintComponent(Graphics g) {
        	super.paintComponent(g);
        	//Il disegno va rieptuto sempre
    		Trait t = null;
    		//disegno tutti i tratti
    		for(int i = 0; i < traits.size(); i++){
    			t = (Trait)traits.get(i);
    			g.drawLine(t.startXPoint, t.startYPoint, t.endXPoint, t.endYPoint);
    		}
      	}
    
    	
    	//Cancella tutti i trtti
    	public void deleteAll(){
    		traits = new Vector();
    		repaint();
    	}
    	
    	//passa alla modalita di cancellazione
    	public void delete(){
    		draw = false;
    	}
    
    	//passa alla modalita di disegno
    	public void draw(){
    		draw = true;
    	}
    	
    	
    	public static void main(String argv[]) {
        	Painter p = new Painter();
        	JFrame f = new JFrame("Mia Prova Lavagna");
        	f.setSize(500, 400);
    		JButton pulsante = new JButton("Cancella");
    	
        	f.getContentPane().add(p, BorderLayout.CENTER);
        	f.getContentPane().add(new ButtonBar(p), BorderLayout.NORTH);
    	
        	f.setVisible(true);
      }
    
    }
    
    
    
    //classe per gestire i pulsanti
    class ButtonBar extends JToolBar implements ActionListener{
    
    	private Painter painter;
    	private JButton draw;
    	private JButton delete;
    	private JButton deleteAll;
    
    	public ButtonBar(Painter painter){
    		this.painter = painter;
    		setRollover(true);
    		draw = new JButton("draw");
    		delete = new JButton("delete");
    		deleteAll = new JButton("deleteAll");
    
    		add(draw);
    		add(delete);
    		add(deleteAll);
    		
    		draw.addActionListener(this);
    		delete.addActionListener(this);
    		deleteAll.addActionListener(this);
    	}
    
    	public void actionPerformed(ActionEvent evt){
    		Object source = evt.getSource();
    		if(source == draw){
    			painter.draw();
    		}
    		if(source == delete){
    			painter.delete();
    		}
    		if(source == deleteAll){
    			painter.deleteAll();
    		}
    	}
    
    }

    Buon lavoro,


  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2001
    Messaggi
    89

    Ciao anx721

    Sei stato più che chiaro... per una persona come me che agli inizi, mi hai dato un pò di luce...
    Solo ora rispondo perchè adesso ho avuto un pò di tempo tra un lavoretto e l'altro...


    L'unica cosa anx721 che non và è il "delete" o per l meno... forse non ho capito bene la sua funzionalità...
    Lo scopo non era di farsì che al premere di quel puilsante si scrivesse (im manier PIù SPESSA... )sulla tavolozza con un colore uguale al background in modo DA simulare una gomma..?


    io volendo fare lo sboroneeee ho provato a fare così dentro il metodo che scrive...


    public void paintComponent(Graphics g) {
    super.paintComponent(g);
    //Il disegno va rieptuto sempre
    Trait t = null;
    //disegno tutti i tratti
    for(int i = 0; i < traits.size(); i++){
    t = (Trait)traits.get(i);
    if (draw = false){

    g.setColor(Color.GREEN);
    g.drawLine(t.startXPoint, t.startYPoint, t.endXPoint, t.endYPoint);
    }else{
    g.drawLine(t.startXPoint, t.startYPoint, t.endXPoint, t.endYPoint);
    }
    }
    }


    Naturalmente il mio livello di frustazione aumenta... perchè proprio non và...
    come potrei fare?
    Grazie ancora
    Giuseppe
    "Nella vita non si è mai fermi o si va avanti o... si va indietro"

  7. #7
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    Non funziona perchè dentro traits ci sono memorizzati tutti i tratti che l'utente ha fatto, ed alcuni erano tratti di disegno ed altri tratti di cancellazione, quindi tu non puoi basarti sul valore di 'draw' in quell'istante e disegnare tutti i tratti dello stesso colore. Quello che serve è sapere per ogni singolo tratto se è un tratto di disegno o un tratto di cancellazione.

    Dunque segui il mio consiglio di modificare la classe Trait includendo un ulteriore campo che identifica se si tratta di un tratto di disegno o di cancellazione, io farei cosi:

    codice:
    //Classe per rappresentare un tratto di disegno
    class Trait{
    
    	//valore che identifica un tratto di disegno
    	public static int DRAW_TRAIT = 0;
    	//valore che identifica un trato di cancellazione
    	public static int DELETE_TRAIT = 1;
    
    	public int startXPoint = 0;
    	public int startYPoint = 0;
    	public int endXPoint = 0;
    	public int endYPoint = 0;
    
    	//campo che è settato al valore di DRAW_TRAIT o di
    	//DELETE_TRAIT per distinguere un tratto di disegno
    	//da un tratto di cancellazione
    	private int traitType;
    
    	public Trait(int x1, int y1, int x2, int y2, int type){
    		startXPoint = x1;
    		startYPoint = y1;
    		endXPoint = x2;
    		endYPoint = y2;
    		traitType = type;
    	}
    
            //Restituisce il tipo del tratto
    	public int getType(){
    		return traitType;
    	}
    }

    Inoltre togli questa classe dall'interno della classe Painter e rendila una clase autonoma (se no non compila). Quindi, quando crei un tratto di diegno nel costruttore devi includere l'intero che rappresenta il tipo di tratto, quindi l'evento di disegno è gestito cosi:

    codice:
    public void mouseDragged(MouseEvent e) {
    	//aggiorna le coordinate
    	startXPoint = endXPoint;
    	startYPoint = endYPoint;
    	endXPoint = e.getX();
    	endYPoint = e.getY();
    
            //Se draw == true aggiungo un tratto di disegno
    	if(draw)
    		traits.add(new Trait(startXPoint, startYPoint, endXPoint, endYPoint, Trait.DRAW_TRAIT));
            //altrimenti aggiungo un tratto di cancellazione
    	else
    		traits.add(new Trait(startXPoint, startYPoint, endXPoint, endYPoint, Trait.DELETE_TRAIT));
    
    	//disegna
    	repaint();
    }

    A questo punto nel metodo paintComponent ti basta sapere qual è il tipo di tratto per disegnarlo di un colore o di un altro, e lo puoi sapere col metodo getType() della classe Trait. Quindi per ogni tratto è sufficiente vedere che tipo di tratto è e settare il colre opportunamente:

    codice:
    public void paintComponent(Graphics g) {
    	super.paintComponent(g);
    	//Il disegno va rieptuto sempre
    	Trait t = null;
    	//disegno tutti i tratti
    	for(int i = 0; i < traits.size(); i++){
    		t = (Trait)traits.get(i);
    		if(t.getType() == Trait.DRAW_TRAIT){
                            //colore di disegno
    			g.setColor(Color.GREEN);
    		}
    		else{
                            //colore di sfondo
    			g.setColor(getBackground());
    		}
    		g.drawLine(t.startXPoint, t.startYPoint, t.endXPoint, t.endYPoint);
    	}
    }

    Infine resta il problema di rendere la linea piu spessa. Il modo piu semplice che mi viene in mente è semplicemente quello di diegnare piu linee una accanto all'altra in modo da aumentare lo spessore. Ad esempio se devi disegnare la linea che va da (10, 10) a (100, 100), puoi far variare la coordinata x del punto iniziale e del punto finale in un range di 5 pixel centrato in 10 per il punto iniziale e in 100 per il punto finale, ovvero puoi disegnare le seguenti 5 linee:

    1 - da (10 - 2, 10) a (100 - 2, 100)
    2 - da (10 - 1, 10) a (100 - 1, 100)
    3 - da (10, 10) a (100, 100) ///linea originale!
    4 - da (10 + 1, 10) a (100 + 1, 100)
    5 - da (10 + 2, 10) a (100 + 2, 100)

    in pratica non disegni solo il tratto vero e proprio ma ne disegni altri 4, di cui 2 a sinistra di quello originario e due a destra, e otteni ciò semplicemente facendo variare la coordinata x delle linee da x - 2 a x + 2 e rieffettuando il disegno per ognuno dei 5 valori.

    Qui di seguito ti riporto il metodo paintComponent cosi modificato; ora la linea di disegno è spessa 9 punti mentre quella di cancellazione è di 25 punti; il disegno di piu linee avviene semplicemente eseguendo un ciclo for che fa viariare la coordinata x:

    codice:
    public void paintComponent(Graphics g) {
    	super.paintComponent(g);
    	//Il disegno va rieptuto sempre
    	Trait t = null;
    
    	//variabile per mantenere la meta dello spessore
    	//della linea
    	int points = 4;
    	//disegno tutti i tratti
    	for(int i = 0; i < traits.size(); i++){
    		t = (Trait)traits.get(i);
    		if(t.getType() == Trait.DRAW_TRAIT){
    			g.setColor(Color.GREEN);
    			points = 4;
    		}
    		else{
    			g.setColor(getBackground());
    			points = 12;
    		}
                    //disegno 2 * points + 1 linee per ottenere lo spessore
    		for(int j = -points; j <= points; j++)
    			g.drawLine(t.startXPoint + j, t.startYPoint, t.endXPoint + j, t.endYPoint);
    	}
    }
    A questo punto la cancellazione e il disegno funzionano. Ora puoi sbizarrirti aggiungendo nuove funzionalità, come:

    - poter decidere lo spessore delle lenee
    - poter usare colori diversi.

    Tieni presente che queste caratteristiche sono tutte cartteristiche intrinseche di un tratto; ogni volta che disegni lo stesso stratto devi ridisegnarlo sempre con lo stesso spessore e lo stesso colore che aveva scelto l'utente, il che ti fa capire che devi ampliare la classe Trait in modo che possa includere informazioni sullo spessore e sul colore.

    Ti metto allego il codice modificato completo e funzionante,
    buon lavoro,



    codice:
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.JFrame.*;
    import java.util.*;
    
    
    //Classe per rappresentare un tratto di disegno
    class Trait{
    
    	//valore che identifica un tratto di disegno
    	public static int DRAW_TRAIT = 0;
    	//valore che identifica un trato di cancellazione
    	public static int DELETE_TRAIT = 1;
    
    	public int startXPoint = 0;
    	public int startYPoint = 0;
    	public int endXPoint = 0;
    	public int endYPoint = 0;
    
    	//campo che è settato al valore di DRAW_TRAIT o di
    	//DELETE_TRAIT per distinguere un tratto di disegno
    	//da un tratto di cancellazione
    	private int traitType;
    
    	public Trait(int x1, int y1, int x2, int y2, int type){
    		startXPoint = x1;
    		startYPoint = y1;
    		endXPoint = x2;
    		endYPoint = y2;
    		traitType = type;
    	}
    
    	public int getType(){
    		return traitType;
    	}
    }
    
    //classe per gestire i pulsanti
    class ButtonBar extends JToolBar implements ActionListener{
    
    	private Painter painter;
    	private JButton draw;
    	private JButton delete;
    	private JButton deleteAll;
    
    	public ButtonBar(Painter painter){
    		this.painter = painter;
    		setRollover(true);
    		draw = new JButton("draw");
    		delete = new JButton("delete");
    		deleteAll = new JButton("deleteAll");
    
    		add(draw);
    		add(delete);
    		add(deleteAll);
    		
    		draw.addActionListener(this);
    		delete.addActionListener(this);
    		deleteAll.addActionListener(this);
    	}
    
    	public void actionPerformed(ActionEvent evt){
    		Object source = evt.getSource();
    		if(source == draw){
    			painter.draw();
    		}
    		if(source == delete){
    			painter.delete();
    		}
    		if(source == deleteAll){
    			painter.deleteAll();
    		}
    	}
    
    }
    
    
    class Painter extends JPanel {
    	private int startXPoint = 0; // coordinata x di partenza
      	private int endXPoint = 0; // coordinata x di arrivo
    	private int startYPoint = 0; // coordinata y di partenza
    	private int endYPoint = 0; // coordinata y di
    
    	//vale true se disegno, false se cancello
    	boolean draw = true;
    
      	//vettore che mantiene la lista dei tratti di disegno
      	private Vector traits;
    	
    	
    	// Costruttore della classe principale
    	public Painter() {
        	super();
        	MouseListener ml = new mListener();
        	addMouseListener(ml);
        	MouseMotionListener mml = new mMotionListener();
        	addMouseMotionListener(mml);
        	
        	traits = new Vector();
      	}
    	
      	//ascoltatore del moto del mouse
      	class mMotionListener implements MouseMotionListener {
    
    		public void mouseDragged(MouseEvent e) {
    			//aggiorna le coordinate
    			startXPoint = endXPoint;
    			startYPoint = endYPoint;
    			endXPoint = e.getX();
    			endYPoint = e.getY();
    
    			//Se draw == true aggiungo un tratto di disegno
    			if(draw)
    				traits.add(new Trait(startXPoint, startYPoint, endXPoint, endYPoint, Trait.DRAW_TRAIT));
    			//altrimenti aggiungo un tratto di cancellazione
    			else
    				traits.add(new Trait(startXPoint, startYPoint, endXPoint, endYPoint, Trait.DELETE_TRAIT));
    			//disegna
    			repaint();
    		}
    
    		public void mouseMoved(MouseEvent e) {
    			// aggiorna le coordinate
    			startXPoint = endXPoint;
    			startYPoint = endYPoint;
    			endXPoint = e.getX();
    			endYPoint = e.getY();
    			//traits.add(new Trait(startXPoint, startYPoint, endXPoint, endYPoint));
    		}
    	}
    
    
    	// ascoltatore dei pulsanti del mouse
    	class mListener implements MouseListener {
    
        	// i seguenti metodi sono richiesti dalla
        	// interfaccia MouseListener anche se non
        	// vengono utilizzati
    
        	public void mouseClicked(MouseEvent e) {}
    	
        	public void mouseEntered(MouseEvent e) {}
    	
        	public void mouseExited(MouseEvent e) {}
    
    
        	// pulsante premuto
        	public void mousePressed(MouseEvent e) {
    
        	}
    
        	// pulsante rilasciato
       		public void mouseReleased(MouseEvent e) {
    
        	}
     	}
    
    
    	public void paintComponent(Graphics g) {
    		super.paintComponent(g);
    		//Il disegno va rieptuto sempre
    		Trait t = null;
    		//variabile per mantenere la meta dello spessore
    		//della linea
    		int points = 4;
    		//disegno tutti i tratti
    		for(int i = 0; i < traits.size(); i++){
    			t = (Trait)traits.get(i);
    			if(t.getType() == Trait.DRAW_TRAIT){
    				g.setColor(Color.GREEN);
    				points = 4;
    			}
    			else{
    				g.setColor(getBackground());
    				points = 12;
    			}
    			for(int j = -points; j <= points; j++)
    				g.drawLine(t.startXPoint + j, t.startYPoint, t.endXPoint + j, t.endYPoint);
    		}
    	}
    
    	
    	//Cancella tutti i tratti
    	public void deleteAll(){
    		traits = new Vector();
    		repaint();
    	}
    	
    	//passa alla modalita di cancellazione
    	public void delete(){
    		draw = false;
    	}
    
    	//passa alla modalita di disegno
    	public void draw(){
    		draw = true;
    	}
    	
    	
    	public static void main(String argv[]) {
        	Painter p = new Painter();
        	JFrame f = new JFrame("Mia Prova Lavagna");
        	f.setSize(500, 400);
        	f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    		JButton pulsante = new JButton("Cancella");
    	
        	f.getContentPane().add(p, BorderLayout.CENTER);
        	f.getContentPane().add(new ButtonBar(p), BorderLayout.NORTH);
    	
        	f.setVisible(true);
      	}
    
    }

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2001
    Messaggi
    89

    Ciao anx721

    davvero sei stato molto.. chiaro... provo a studiarmelo un pò e cercare di modificaarlo.
    Ora proverò a mettere un pulsante per cambiare il colore.
    Oggi sono stato un pò preso dal lavoro, ma ci provo subito.
    Davvero mille grazie per la tua chiarezza.

    Senz'altro se ci sei, e se posso posterò qualche altro mio dubbio/pasticcio.
    Ciao e buona serata
    Giuseppe R.
    "Nella vita non si è mai fermi o si va avanti o... si va indietro"

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.