Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2009
    Messaggi
    23

    [JAVA]Ridisegno di un JPanel

    Salve a tutti,

    Ho una classe che si occupa di disegnare un grafico su un piano cartesiano su un jPanel dotato di barre di scroll
    Questa è la classe:

    codice:
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.image.BufferedImage;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    import javax.swing.JPanel;
    
    
    public class PannelloDisegno extends JPanel {
    
        int xMin, xMax, yMin, yMax;
    // gli intervalli in cui vogliamo disegnare
        int larghezza = 1800, altezza = 1600;
    // corrispondono alla grandezza del pannello
        double fattoreScalaX, fattoreScalaY;
        BufferedImage buffer;
    
        PannelloDisegno(int xmax, int ymax) {
            xMin = xmax * (-1);
            xMax = xmax;
            yMin = ymax * (-1);
            yMax = ymax;
            scalaPannello();
        }
    
        public void scalaPannello() {
    
            buffer = new BufferedImage(larghezza, altezza, BufferedImage.TYPE_INT_RGB);//disegno su un buffer
            Graphics g = buffer.getGraphics();
            fattoreScalaX = larghezza / ((double) xMax - xMin);
            fattoreScalaY = altezza / ((double) yMax - yMin);
            g.setColor(Color.red);
            g.drawLine(0, altezza / 2, larghezza - 1, altezza / 2);
            g.drawLine(larghezza / 2, 0, larghezza / 2, altezza - 1);
    // scrittura valori estremi degli assi
            g.drawString("" + xMin, 5, altezza / 2 - 5);
            g.drawString("" + xMax, larghezza - 20, altezza / 2 - 5);
            g.drawString("" + yMax, larghezza / 2 + 5, 15);
            g.drawString("" + yMin, larghezza / 2 + 5, altezza - 5);
    
            this.setPreferredSize(new Dimension(larghezza, altezza));
            this.updateUI();
        }
    
        
        @Override
        public void paintComponent(Graphics g) {
                try {
                super.paintComponent(g);
                g.drawImage(buffer, 0, 0, this);//ricopio il buffer sul monitor
            } catch (Exception ex) {
                Logger.getLogger(PannelloDisegno.class.getName()).log(Level.SEVERE, null, ex);
            }
    
        }
    
        void setLine(Punto p1, Punto p2) throws Exception {//disegna una linea da p1 a p2
            Graphics g = buffer.getGraphics();
            g.setColor(Color.green);
            g.drawLine((int) ((p1.getXi(0) - xMin) * fattoreScalaX), (int) (altezza - (p1.getXi(1) - yMin) * fattoreScalaY),
                    (int) ((p2.getXi(0) - xMin) * fattoreScalaX), (int) (altezza - (p2.getXi(1) - yMin) * fattoreScalaY));
            this.updateUI();
    
        }
    
    
    }
    il pannello può essere ridimensionato impostando i valori xMin, xMax, yMin, yMax che vengono inseriti dall'utente. Il problema è che non appena il pannello viene ridimensionato con i nuovi valori, il grafico viene cancellato e rimangono solo gli assi cartesiani. C'è modo di risolvere?

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

    Re: [JAVA]Ridisegno di un JPanel

    Originariamente inviato da Anakin84
    il pannello può essere ridimensionato impostando i valori xMin, xMax, yMin, yMax che vengono inseriti dall'utente. Il problema è che non appena il pannello viene ridimensionato con i nuovi valori, il grafico viene cancellato e rimangono solo gli assi cartesiani. C'è modo di risolvere?
    Innanzitutto updateUI() non ti serve. Ha a che fare con i look&feel e solo di "riflesso" fa quello che tu stavi pensando che facesse. Per chiedere il ridisegno si usa una delle versioni di repaint(). Punto.

    paintComponent() sarebbe meglio tenerlo 'protected', insomma non c'è un motivo particolare per "ampliare" il livello di accesso. Il try/catch non servirebbe nemmeno. Se fai solo "disegni" generalmente non dovrebbe capitare nulla di "grave". Comunque non è sbagliato.

    Quando ottieni un Graphics da una immagine, alla fine quando non lo usi più dovresti fare un dispose().
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2009
    Messaggi
    23
    Ciao,
    Ho corretto la classe così:

    codice:
    public class PannelloDisegno extends JPanel {
    
        int xMin, xMax, yMin, yMax;
    // gli intervalli in cui vogliamo disegnare
        int larghezza = 1800, altezza = 1600;
    // corrispondono alla grandezza del pannello
        double fattoreScalaX, fattoreScalaY;
        BufferedImage buffer;
    
        PannelloDisegno(int xmax, int ymax) {
            xMin = xmax * (-1);
            xMax = xmax;
            yMin = ymax * (-1);
            yMax = ymax;
            scalaPannello();
        }
    
        public void scalaPannello() {
    
            buffer = new BufferedImage(larghezza, altezza, BufferedImage.TYPE_INT_RGB);//disegno su un buffer
            Graphics g = buffer.getGraphics();
            fattoreScalaX = larghezza / ((double) xMax - xMin);
            fattoreScalaY = altezza / ((double) yMax - yMin);
            g.setColor(Color.red);
            g.drawLine(0, altezza / 2, larghezza - 1, altezza / 2);
            g.drawLine(larghezza / 2, 0, larghezza / 2, altezza - 1);
    // scrittura valori estremi degli assi
            g.drawString("" + xMin, 5, altezza / 2 - 5);
            g.drawString("" + xMax, larghezza - 20, altezza / 2 - 5);
            g.drawString("" + yMax, larghezza / 2 + 5, 15);
            g.drawString("" + yMin, larghezza / 2 + 5, altezza - 5);
    
            this.setPreferredSize(new Dimension(larghezza, altezza));
            //this.updateUI();
           this.repaint();
        }
    
       
    
        
        @Override
       protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                g.drawImage(buffer, 0, 0, this);//ricopio il buffer sul monitor
        }
    
        void setLine(Punto p1, Punto p2)  {//disegna una linea da p1 a p2
            Graphics g = buffer.getGraphics();
            g.setColor(Color.green);
            g.drawLine((int) ((p1.getXi(0) - xMin) * fattoreScalaX), (int) (altezza - (p1.getXi(1) - yMin) * fattoreScalaY),
                    (int) ((p2.getXi(0) - xMin) * fattoreScalaX), (int) (altezza - (p2.getXi(1) - yMin) * fattoreScalaY));
            //this.updateUI();
           repaint();
        }
    }
    mentre per quanto riguarda il grafico il codice dell'evento che ridisegna il pannello e questo:

    codice:
    pannello.scalaPannello();
            if (disegnato) {
                for (i = 0; i < p.lista.size() - 1; i++) {
                    pannello.setLine(p.lista.get(i), p.lista.get(i + 1));
                }
            }
    quindi prima ridisegno il pannello con scalaPannello();
    dopodichè semplicemente scorro nuovamente la lista dei punti per ridisegnare il grafico da capo!

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 © 2026 vBulletin Solutions, Inc. All rights reserved.