Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11

Discussione: [Java]Problema JPanel

  1. #1
    Utente di HTML.it L'avatar di Xadoom
    Registrato dal
    Dec 2002
    Messaggi
    1,491

    [Java]Problema JPanel

    Ho un JPanel sul quale con il mosue posso disegnare linee, fino a qui ok; il problema si pone quando voglio visualizzare la linea PRIMA di disegnarla definitivamente, per intenderci "clicco" in un punto e tenendo il tasto spinto trascino il cursore (man mano che muovo il mouse si sposta anche la linea) e quando rilascio la linea si disegna fino al punto di rilascio.
    Ok, riesco a fare anche questo, ma il problema è che quando vado a disegnare un'altra linea la prima mi viene cancellata....
    Insomma vi posto il codice....

    codice:
     
    private void jPanel2MousePressed(java.awt.event.MouseEvent evt) {
            // Punto di inizio 
            x1 = evt.getX();
            y1 = evt.getY();
            System.out.println(x1 +" " +y1);
    }
    
    
    private void jPanel2MouseReleased(java.awt.event.MouseEvent evt) {
            // Punto finale
            x2 = evt.getX();
            y2 = evt.getY();
            disegna();
        }
    
    private void jPanel2MouseDragged(java.awt.event.MouseEvent evt) {
            // Serve a visualizzare la linea che si sta tracciando
            jPanel2.repaint();                               
            x2 = evt.getX();
            y2 = evt.getY();        
            jPanel2.getGraphics().drawLine(x1,y1, x2, y2);
        }
    private void disegna(){
            Graphics g = jPanel2.getGraphics();
            g.drawLine(x1, y1, x2, y2);
        }
    Cerco di riassumere:il fatto è che dopo che nel metodo disegna() ho disegnato la linea se aggiorno la JPanel (magari per disegnare un'altra linea) la precedente mi scompare...
    Qualsiasi consiglio è benvenuto.....grazie
    Windows Xp
    [Java]
    [PHP]Notepad++
    [Fortran90-77] elf90 g77
    [C++ /WinAPI] DevC++ VisualC++

  2. #2
    Utente di HTML.it
    Registrato dal
    Mar 2002
    Messaggi
    315
    codice:
    private void jPanel2MouseDragged(java.awt.event.MouseEvent evt) {
            // Serve a visualizzare la linea che si sta tracciando
    
            //togli queto repaint
            //jPanel2.repaint();                               
            x2 = evt.getX();
            y2 = evt.getY();        
            jPanel2.getGraphics().drawLine(x1,y1, x2, y2);
        }
    Ogni volta che il tasto del mouse viene rilasciato, il metodo chiama repaint(), che serve a cancellare la linea. Se togli la chiamata a repaint() vengono disegnate tutte le linee, anche se le sovrapponi. Se pero' midifichi le dimensioni del frame o ci passi sopra con un' altra finestra, queste verranno cancellate.
    Ciao,
    Lorenzo

  3. #3
    Utente di HTML.it L'avatar di Xadoom
    Registrato dal
    Dec 2002
    Messaggi
    1,491
    Sì, ma in questo modo mentre muovo il mouse mi veranno disegnate tutte le linee....invece mentre sposto il cursore le linee momentanee devono sparire e restare solo la finale quando rilascio il pulsante!

    Help...
    Windows Xp
    [Java]
    [PHP]Notepad++
    [Fortran90-77] elf90 g77
    [C++ /WinAPI] DevC++ VisualC++

  4. #4
    Utente di HTML.it
    Registrato dal
    Mar 2002
    Messaggi
    315
    Hai ragione, scusa, ho capito male.
    Per fare quello che intendi tu dovresti ridefinire il metodo paintComponent del tuo JPanel, in modo che disegni un vettore di righe. Questo vettore (di dimensioni variabili) parte vuoto, e mano a mano che disegni le righe, memorizza le coordinate delle linee da disegnare. Cosi' facendo potresti anche implementare un metodo che le cancella, semplicemente togliendo elementi al vettore.
    L'aggiunta degli elementi nel vettore va fatta in corrispondenza del rilascio del pulsante del mouse.
    Ciao,
    Lorenzo

  5. #5
    Utente di HTML.it L'avatar di floyd
    Registrato dal
    Apr 2001
    Messaggi
    3,837
    non puoi cambiare le stesse variabili
    devi usare un vettore in cui aggiungi array di x1, y1, x2, y2 quando lasci il mouse e nel disegna disegnare tutti gli array che trovi nel vettore con get
    disegna() {
    Graphics g = jPanel2.getGraphics();
    for (int i=0; i<vec.size(); i++) {
    int[] p = (int[])vec.getElementAt(i);
    int X1 = p[0];
    ...
    g.drawLine(X1, Y1, X2, Y2);
    }
    }

  6. #6
    Utente di HTML.it
    Registrato dal
    Mar 2002
    Messaggi
    315
    Pero' in questo modo, ogni volta che viene chiamato repaint(), spariscono tutte le linee disegnate.
    Nel momento in cui disegna una nuova linea, poi, viene chiamato disegna() e quindi riappaiono tutte contemporaneamete.
    Ciao,
    Lorenzo

  7. #7
    Utente di HTML.it L'avatar di Xadoom
    Registrato dal
    Dec 2002
    Messaggi
    1,491
    Ho capito, vedrò se mi conviene fare come dite o abbandonare l'idea della linea che si crea mentre trascino il mouse.......grazie
    Windows Xp
    [Java]
    [PHP]Notepad++
    [Fortran90-77] elf90 g77
    [C++ /WinAPI] DevC++ VisualC++

  8. #8
    C'è un modo molto + semplice per far quello che ti sei prefisso (nel caso io non abbia frainteso il tuo obiettivo).

    Il metodo mouseDragged dovrebbe essere più o meno così:

    codice:
    void mouseDragged(MouseEvent me) {
        Graphics g = _panel.getGraphics();
        g.setColor(_panel.getBackGround());
        g.setXORMode(_panel.getBackGround());
        g.drawLine(x1, y1, x2, y2);
        x2 = me.getX();
        y2 = me.getY();
        g.drawLine(x1, y1, x2, y2);
    }
    Dovrebbe andare.
    - "Boy, the food at this place is really terrible."
    - "Yeah, I know, and such ... small portions."

  9. #9
    Utente di HTML.it
    Registrato dal
    Mar 2002
    Messaggi
    315
    Il tuo metodo e' corretto (a parte che bisogna cancellare il primo setColor, altrimenti non visualizza nulla), ma serve a visualizzare la riga intanto che si sposta il mouse. Rimane il problema di tenere in memoria le righe gia' tracciate.
    Nel momento in cui si sposta o si ridimensiona la finestra viene chiamato repaint() e quindi bisogna dire al programma di ridisegnare le linee memorizzate.
    Ciao,
    Lorenzo

  10. #10
    Ok. Quando rilascia il pulsante del mouse, prende le coordinate (x1, y1, (x2, y2) e poi fa come hai detto tu precedentemente.
    - "Boy, the food at this place is really terrible."
    - "Yeah, I know, and such ... small portions."

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.