Visualizzazione dei risultati da 1 a 4 su 4

Discussione: Disegnare rettangoli

  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2011
    Messaggi
    43

    Disegnare rettangoli

    Ciao a tutti, dovrei realizzare un semplice programma che mi disegna due rettangoli su un pannello di dimensioni variabili, il primo rettangolo all'avvio si deve trovare il posizione (0, 0), il secondo rettangolo nell'angolo opposto, quindi partendo dall'angolo in basso a dx.
    Ho provato ad utilizzare la funzione fillRect(), la quale pero' non mi permette di disegnare con valori negativi, allora ho deciso di risolvere in questo modo, mi calcolo la dimensione del mio pannello, e poi sottraggo la larghezza e l'altezza alle coordinate x e y dell'angolo in basso a dx per poter avere il punto (x,y) da cui partire per disegnare il mio rettangolo.
    Il problema si presenta a questo punto, perche' dentro al metodo paintComponent() riesco ad avere le dimensioni del pannello, e invece in qualsiasi altro metodo contenuto nella classe Panel() (la stessa classe in cui si trova il metodo paintComponent) se tento di calcolarmi le dimensioni del pannello, mi viene restituita altezza 0 e larghezza 0 ???

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

    Re: Disegnare rettangoli

    Originariamente inviato da cryspolo
    Ho provato ad utilizzare la funzione fillRect(), la quale pero' non mi permette di disegnare con valori negativi
    width/height negativi ovviamente no, non li accetta. Ma x/y, sì, anche negativi.
    Se fai g.fillRect(-50, -50, 100, 100) (supponendo l'origine del Graphics come predefinito, cioè non traslato), allora "vedi" solo un 50x50 perché il resto è fuori dal componente.

    A parte questo non capisco perché ti servirebbe un valore negativo ...

    Originariamente inviato da cryspolo
    allora ho deciso di risolvere in questo modo, mi calcolo la dimensione del mio pannello, e poi sottraggo la larghezza e l'altezza alle coordinate x e y dell'angolo in basso a dx per poter avere il punto (x,y) da cui partire per disegnare il mio rettangolo.
    Infatti è così che va fatto.

    Originariamente inviato da cryspolo
    Il problema si presenta a questo punto, perche' dentro al metodo paintComponent() riesco ad avere le dimensioni del pannello, e invece in qualsiasi altro metodo contenuto nella classe Panel() (la stessa classe in cui si trova il metodo paintComponent) se tento di calcolarmi le dimensioni del pannello, mi viene restituita altezza 0 e larghezza 0 ???
    La dimensione "reale" del componente (getWidth()/getHeight()/getSize()) è disponibile solo da un certo momento in poi, tecnicamente solo dopo che il componente (e ciò che lo contiene) diventa "displayable".

    Per farti capire, in una classe che estende JFrame, nel costruttore:

    codice:
    TuoPannello tuoPannello = new TuoPannello();
    
    System.out.println(tuoPannello.getSize());   // 0 x 0
    
    getContentPane().add(tuoPannello);
    
    System.out.println(tuoPannello.getSize());   // ancora 0 x 0
    
    setVisible(true);
    
    System.out.println(tuoPannello.getSize());   // QUI hai le dimensioni
    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
    Jun 2011
    Messaggi
    43
    Io ho la classe Panel, cosi' definita:

    codice:
    public class Panel extends JPanel {
        DrawPanel drwPanel;                                   //Pannello in cui andro' a disegnare
        CommandPanel cmdPanel;                            //Pannello in cui metto i vari pulsanti
        
        Panel() {
            cmdPanel = new CommandPanel();            //Istanzio il pannello dei comandi
            drwPanel = new DrawPanel();                   //Istanzio il pannello per disegnarci sopra 
            
            cmdPanel.setDrawPanel(drwPanel);            //Collego i due pannelli
            drwPanel.setCommandPanel(cmdPanel);      //Come il commento precedente
                          
            this.setLayout(new BorderLayout());            //Imposto il layout e le posizioni dei              
                                                                           pannelli
            this.add(drwPanel, BorderLayout.CENTER);
            this.add(cmdPanel, BorderLayout.SOUTH);  
        }
         drawpanel.setFigure();                                  //Metodo per istanziare i due rettangoli
    }
    la calsse DrawPanel, contenente la paintComponent e il metodo per istanziare i due rettangoli

    codice:
    public class DrawPanel extends JPanel implements MouseListener{
        CommandPanel cmdPanel;
        int x;
        int y;
        LinkedList <Figure>lista;                       //Lista che conterra' i due rettangoli
        
        DrawPanel() {
            lista = new LinkedList();
            
            this.addMouseListener(this);
            
            this.setVisible(true);
        }
        
        public void setCommandPanel (CommandPanel cmdPanel) {
            this.cmdPanel = cmdPanel;
        }
        
        public void setFigure() {
    
            int dimX = Integer.parseInt(this.cmdPanel.panelbX.getText());      //Leggo la 
                                                                                                        dimensione di un 
                                                                                                        lato del rettangolo 
                                                                                                        da un campo di  
                                                                                                        testo  
            int dimY = Integer.parseInt(this.cmdPanel.panelbY.getText());      //Come sopra
            
            Figure f1 = new Figure("f1", 0, 0, dimX, dimY, Color.blue);           //Istanzio la prima 
                                                                                                        figura e la metto 
                                                                                                        nella lista
            this.lista.add(f1);
            
            dimX = Integer.parseInt(this.cmdPanel.panelgX.getText());           //Rifaccio quanto  
                                                                                                         fatto sopra per la 
                                                                                                         seconda figura 
            dimY = Integer.parseInt(this.cmdPanel.panelgY.getText());
            
            int width = this.getWidth();                     //Poiche' la seconda figura deve essere 
                                                                         posizionata nell'angolo in basso a dx mi 
                                                                         calcolo la dimensione del pannello                                 
            int height = this.getHeight();                   
    
          //Le due operazioni qui sopra mi restituiscono height = 0,                               
                                                                                           width = 0
    
            Figure f2 = new Figure("f2", (width-dimX), (height-dimY), dimX, dimY, Color.yellow);
            this.lista.add(f2);
            
            repaint();
        }
    
        @Override
        public void mouseClicked(MouseEvent me) {  
        }
    
        @Override
        public void mousePressed(MouseEvent me) {}
    
        @Override
        public void mouseReleased(MouseEvent me) {}
    
        @Override
        public void mouseEntered(MouseEvent me) {}
    
        @Override
        public void mouseExited(MouseEvent me) {}
        
        @Override
        protected void paintComponent(Graphics g) {
            int Width = getSize().width;
            int Height = getSize().height;
            
            g.setColor(Color.white);
            g.fillRect(0, 0, Width, Height);
            
            if(this.lista.isEmpty()) {
                return;
            }
            else {
                Iterator i = this.lista.iterator();
                
                while(i.hasNext()) {
                    Figure f = (Figure)i.next();
                    
                    g.setColor(f.Color);
                    g.fillRect(f.X, f.Y, f.dimX, f.dimY);
                }
            }
        }
    }
    //Le due operazioni qui sopra mi restituiscono height = 0, width = 0

    Perche' ???

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da cryspolo
    //Le due operazioni qui sopra mi restituiscono height = 0, width = 0

    Perche' ???
    Innanzitutto il setVisible(true) nel costruttore di DrawPanel non serve a niente. I componenti non top-level (quindi esclusi es. JFrame, JDialog) sono già "visibili" per default (la proprietà visible è già a true).
    Sono i componenti top-level es. JFrame che vanno resi esplicitamente visibili. Il mio esempio sopra aveva setVisible riferito a JFrame (o classe che estende JFrame).

    E comunque, per tornare alla tua ultima domanda, il setFigure dove usi getWidth/getHeight è (sicuramente) ancora chiamato in un momento in cui il tutto non è ancora "displayable". (e quindi non ci sono dimensioni reali calcolate)
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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.