Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    18

    java e swt. Come aggiornare il GC dopo un MouseEvent

    Premetto che uso WindowBuilder e le librerie SWT per creare le mie interfacce grafiche.
    Ho un oggetto Canvas a cui ho aggiunto gli ascoltatori di eventi:

    codice:
    canvas.addPaintListener(new PaintListener() {
     		      public void paintControl(PaintEvent e) {
                             e.gc .drawImage(myImage, 10, 10);
     		       }
     		    });
    
    canvas.addMouseListener(new MouseAdapter() {
     @Override
    public void mouseUp(MouseEvent e) {
    	int cx,cy;
    	cx = (e.x-48)/70;	cy = (e.y-48)/70;
    	if ((e.x >= 48) && (e.y >= 48) )
                {
    	 	if( pOK == true) mOK = check.ControllaMosse(cx,cy);
    		.............. 
                 } 				 		
    	}
     });
    Come faccio a recuperare lo stesso gc presente in paintControl(PaintEvent e) per poter ridisegnare delle nuove immagini nello stesso Canvas in cui ho disegnato myImage ?

  2. #2
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    18

    [Risolto parzialmente]

    Dopo tanto girare su google e analizzare codice sono riuscito a capire come fare: .
    Cercherò di esssere chiaro ma non è semplice data la complessità del post.

    Premessa: Io utilizzo WindowBuilder (plug-in di Eclipse) per creare la mia interfaccia grafica. Canvas è un oggetto ottenuto dall' oggetto Shell che utilizzo per aggiungere i miei gestori di eventi( non ricordo esattamente dove l' ho preso, probabilmente me lo ha inserito WindowBuilder ....)

    Innazitutto ho implementato l'interfaccia PaintListener in una classe pubblica( public class, cioè in un file separato) a cui ho dato il nome MyPaintListener in cui ovviamente ho implementato il metodo PaintControl.

    (OPZIONALE) Definisco un campo (field) static pOK( e anche delle altre ma farò in seguito riferimento solo ad essa), nella stessa classe ClientGUI in cui ho costruito la mia interfaccia grafica.

    Implemento, sempre in una public class, l'interfaccia MouseAdapter che ho chiamato MyMouseAdapter in cui implemento mouseUp(ho deciso che la mia interfaccia debba rispondere a all'evento del mouse "click rilasciato") in cui modifico il valore della mia variabile statica pOK(non è obbligatorio ma può tornare utile come vedremo).

    Infine, all'interno di MyMouseAdapter, recupero il Canvas, elemento da cui ho ricevuto l'evento, e richiamo i metodi redraw() e update() , metodi predefiniti in SWT, con cui obbligo la JVM a ridisegnare tutto il Canvas(viene di fatto, se ho capito bene, generato un evento PaintEvent che verrà gestito nel PaintControl).

    Quindi in PaintControl precedentemente visto(che viene chiamato ogni volta che si genera un evento relativo all'interfaccia grafica oltre che richiamato esplicitamente come fatto sopra) posso disegnare quello che voglio sul mio Canvas anche(e soprattutto) leggendo la variabile statica pOK su cui mi baso per ridisegnare il mio Canvas.
    Infine di nuovo recupero il Canvas in cui sto disegnando e richiamo i metodi redraw() e update() , metodi predefiniti in SWT, con cui obblica la JVM a ridisegnare tutto il Canvas.

    In pratica a seguito dei miei click del mouse cambio i dati di riferimento su cui mi baso per disegnare sul mio oggetto Canvas e in seguito quando viene generato un Paint Event ridisegno effettivamente il mio Canvas.

    Posto il mio codice:

    public void mouseUp(MouseEvent e) {

    int cx,cy;
    Canvas canvas;

    cx = (e.x-48)/70; cy = (e.y-48)/70; // trovo le coordinate della mia scacchiera

    if ((e.x >= 48) && (e.y >= 48) && (e.x <= 607) && (e.y <= 607)){

    if(ClientGUI.pOK==false){
    ClientGUI.pOK = true;
    ClientGUI.pOK_x = cx;
    ClientGUI.pOK_y = cy;
    }
    else {
    ClientGUI.pOK = false;
    ClientGUI.pOK_x = 0;
    ClientGUI.pOK_y = 0;
    }
    canvas = (Canvas) e.getSource();
    canvas.redraw();
    canvas.update();
    }

    public void paintControl(PaintEvent e) {

    e.gc.drawImage(image, 10, 10);
    if(ClientGUI.pOK == true)
    {
    disegnaSelezione(e); // metodo definiti sempre nella stessa classe
    }
    disegnaPezzi(e); // metodo definiti sempre nella stessa classe
    canvas = (Canvas) e.getSource();
    canvas.redraw();
    canvas.update();
    }


    Così facendo sono riuscito a strutturare un minimo il codice, ma non sono convinto che sia la scelta migliore,
    riporto alcuni dubbi che mi sono venuti in mente:
    - in particolare è possibile non utilizzare una o più variabili statiche per tenere traccia di ciò che ho fatto con il mouse?
    - ho dovuto definire image nella classe MyPaintListener, come faccio a definirla altrove senza definirla static?

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.