Pagina 1 di 4 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 33
  1. #1

    Disegnare Cerchi concentrici su JPanel

    Ciao a tutti, per esercizio dovrei fare un'applicazione che contenga un bottone di reset, due textarea in cui immetto dei dati e un JPanel sul quale devono essere disegnati 4 cerchi concentrici con il centro nel vìcentro del JPanel..di seguito metto le due classi adibite a questo:
    codice:
    Classe Pannello
    
    package Bersaglio;
    
    import javax.swing.JPanel;
    import java.awt.BorderLayout;
    import java.awt.Color;
    import javax.swing.JButton;
    import javax.swing.JTextArea;
    import java.awt.*;
    import javax.swing.JTextField;
    import javax.swing.JLabel;
    
    
    public class Pannello extends JPanel {
    
        private JPanel sopra;
        private JPanel sotto;
        private JPanel sopra_sinistra;
        private JPanel sopra_destra;
        private JPanel panel_x;
        private JPanel panel_y;
        private JButton stato;
        private JLabel abilitato;
        private JLabel o;
        private JLabel i;
        private JTextField area_o;
        private JTextField area_i;
       // private AscoltaMouse mouse;
        private Bottone bottone;
        private DisegnaCerchi disegna;
        private Graphics cerchio;
    
        public Pannello() {
    
            super();
    
            sopra = new JPanel();
            sotto = new JPanel();
    
            this.setLayout(new BorderLayout());
            this.add(sopra, BorderLayout.NORTH);
            this.add(sotto, BorderLayout.CENTER);
    
            sopra.setBackground(Color.BLUE);
            sopra.setLayout(new BorderLayout());
            sotto.setBackground(Color.GRAY);
    
            sopra_sinistra = new JPanel();
            sopra_destra = new JPanel();
    
            sopra_sinistra.setLayout(new BorderLayout());
            sopra_destra.setLayout(new BorderLayout());
            sopra.add(sopra_sinistra, BorderLayout.WEST);
            sopra.add(sopra_destra, BorderLayout.CENTER);
            sopra_sinistra.setBackground(Color.GREEN);
            sopra_destra.setBackground(Color.ORANGE);
    
            stato = new JButton("RESET");
            sopra_sinistra.add(stato, BorderLayout.WEST);
    
            //abilitato = new JLabel("ABILITATO");
            //sopra_sinistra.add(abilitato, BorderLayout.EAST);
    
            panel_x = new JPanel();
            panel_y = new JPanel();
            panel_x.setLayout(new FlowLayout());
            panel_y.setLayout(new FlowLayout());
            o = new JLabel("OUTPUT = ");
            i = new JLabel("INPUT  = ");
    
            area_o = new JTextField("0");
            area_i = new JTextField("45");
    
            area_o.setEditable(false);
            area_i.setEditable(true);
    
            sopra_destra.add(panel_x,BorderLayout.NORTH);
            sopra_destra.add(panel_y,BorderLayout.SOUTH);
    
            panel_x.add(o);
            panel_x.add(area_o);
            panel_y.add(i);
            panel_y.add(area_i);
    
            area_o.setEditable(false);
            area_i.setEditable(true);
    
             bottone = new Bottone(area_o,area_i);
             stato.addActionListener(bottone);
    
             
    
    
           // mouse = new AscoltaMouse(area_x,area_y,abilitato);
    
           // sotto.addMouseMotionListener(mouse);
    
        }
    }
    
    ---------------------------classe DisegnaCerchio------------------------------------------
    
    package Bersaglio;
    
    import java.awt.*;
    import java.awt.event.*;
    import java.applet.*;
    import javax.swing.JPanel;
    import javax.swing.JApplet;
    
    public class DisegnaCerchi extends JPanel {
    
        public DisegnaCerchi() {
        }
    
        public void paintComponent(Graphics abc) {
            
            super.paintComponent(abc);
            
            abc.drawOval(200,200,200,200);
        }
    }
    praticamente mi sono perso su come mettere il tutto insiemem a far si che sul JPanel denominato "sotto" vengano disegnati i cerchi (all'inizio me ne basta uno poi vedo per gli altri 3)..qualcuno mi sa indicare una soluzione? ciao grazie

  2. #2
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    906
    Va bene come hai fatto. Fai una classe apposita che estende JPanel e nella quale disegni i tre cerchi. Poi quando ti serve istanzi un JPanel di questo tipo e lo utilizzi.
    L'errore nel tuo codice e' che devi mettere
    codice:
    sotto = new DisegnaCerchi(); //devi istanziare il JPanel da te scritto non uno generico
    Le coordinate e dimensioni dei cerchi potresti scriverle in funzioni delle dimensioni del pannello (this.getSize().getWidth e this.getSize().getHeight()) in modo che sia indipendente dalle dimensioni del JFrame o JPanel nel quale verra' inserito.

  3. #3
    grazie mille, provo e ti so dire...grazie

  4. #4
    perfetto simo7784, funziona..adesso mi si sta presentando un altro problemino..scusate ma vado per tentativi e piccoli passi anche se so che in fondo sono cavolate ste cose: praticamente il cerchio dovrebbe essere sempre in centro al pannello "sotto" e soprattutto se ingrandisco o comunque modifico le dimensioni della finestra il cerchio deve muoversi con essa, non restare fermo nel punto...per la prima cosa ho fatto così:

    codice:
    public class DisegnaCerchi extends JPanel {
    
        int alt,largh;
    
        public DisegnaCerchi() {
            
            alt = this.getHeight()/2;
            largh = this.getWidth()/2;
            
        }
    
        public void paintComponent(Graphics abc) {
    
            super.paintComponent(abc);
    
            abc.drawOval(alt,largh,100,100);
        }
    }
    però mi sono accorto di non aver capito in che unità di misura ragionano i metodi getHegth e getWidth, o perlomeno non lavorano come pensavo io, perchè il cerchio me lo disegnano in cima a sinistra del pannello "sotto"...

    grazie

  5. #5
    effettivamente per controllo ho messo un paio di System.out che mi scrivano sia this.getSize().getHeigth() (e getWidth) e sia la versione this.getSize() e la versione this.getHeigth (e getWidth) ma sia nella classe DisegnaCerchi, sia in quella Pannello, mi danno valori 0...e quindi è ovvio che me li scrivano in cima a sinistra...

    Ad ogni modo, senza addentrarsi nel perchè e percome, mi basterebbe sapere come fare per centrarli nel pannello e fare in modo che il layout sia liquido, cioè che a qualsiasi dimensione del pannello il cerchio (in futuro i cerchi) siano sempre al centro del pannello stesso..

    ciao grazie

  6. #6
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    906
    Il metodo drawOval vuole come primi due parametri le coordinate del angolo in alto a sinistra del rettangolo contenente l'ovale e come successivi due parametri diametro orizzontale e verticale dell'ovale(in caso di cerhci i valori devono essere uguali).
    Non salvare altezza e larghezza nel costruttore, ma utilizza due variabili locali nel metodo paintComponent, cosi' vengono calcolate ad ogni iterazione e il layout diventa liquido.
    codice:
    public class DisegnaCerchi extends JPanel {
        //Il padding e la distanza dal bordo del JPanel, la utilizzo quando disegno il cerchio.
        public static final int PADDING = 5;
        public DisegnaCerchi() {}
    
        public void paintComponent(Graphics abc) {
            super.paintComponent(abc);
            //calcolo le dimensioni come il minimo dei lati del pannello. 
            //Casto a int perche' i metodi restituiscono double.
            //nota non uso this.getHeight(), ma this.getSize().getHeight().
            int dimensioni = (int)(Math.min(this.getSize().getWidth, this.getSize().getHeight()));
            abc.drawOval(PADDING,PADDING,dimensioni-(PADDING*2),dimensioni-(PADDING*2));
        }
    }

  7. #7
    Ma questo esercizio è per caso il testo di un esame dell'università di programmazione 2??? Scusate l'OT...ma è proprio identico a quello che ho fatto io 1 mese fa!!!!
    Nerviamo nel cuore la Gnocca sempre, ma in Testa e sotto il Culo la Mia VESPA!!!

  8. #8
    Esattamente..solo che io non l'ho passato, altrimenti non sarei qui a chiedere...

  9. #9
    Originariamente inviato da simo7784
    Il metodo drawOval vuole come primi due parametri le coordinate del angolo in alto a sinistra del rettangolo contenente l'ovale e come successivi due parametri diametro orizzontale e verticale dell'ovale(in caso di cerhci i valori devono essere uguali).
    Non salvare altezza e larghezza nel costruttore, ma utilizza due variabili locali nel metodo paintComponent, cosi' vengono calcolate ad ogni iterazione e il layout diventa liquido.
    codice:
    public class DisegnaCerchi extends JPanel {
        //Il padding e la distanza dal bordo del JPanel, la utilizzo quando disegno il cerchio.
        public static final int PADDING = 5;
        public DisegnaCerchi() {}
    
        public void paintComponent(Graphics abc) {
            super.paintComponent(abc);
            //calcolo le dimensioni come il minimo dei lati del pannello. 
            //Casto a int perche' i metodi restituiscono double.
            //nota non uso this.getHeight(), ma this.getSize().getHeight().
            int dimensioni = (int)(Math.min(this.getSize().getWidth, this.getSize().getHeight()));
            abc.drawOval(PADDING,PADDING,dimensioni-(PADDING*2),dimensioni-(PADDING*2));
        }
    }
    Così non funziona come volevo io..allora, il cerchio dovrebbe essere centrato nela pannello in questione, il nostro "this" praticamente..se i primi due parametri sono le coordinate dell'angolo in cima a sinistra del rettangolo (in questo caso quadrato) circoscritto al mio cerchio, e il cerchio deve avere raggio 45 (scusa, prima l'avevo omesso), io ho fatto una cosa del genere, che però non funziona:

    codice:
    public void paintComponent(Graphics abc) {
    
            super.paintComponent(abc);
            
            int centroL = ((int)((this.getSize().getWidth())/2))+45;
            int centroA = ((int)((this.getSize().getHeight())/2))-45;
    
            int dimensioni = (int)(Math.min(this.getSize().getWidth(), this.getSize().getHeight()));
            
            abc.drawOval(centroL,centroA,90,90);
        }
    in teoria con this.getSize().getHeight())/2 ricavo la metà dell'altezza del pannello this, con getWidth/2 la metà della larghezza, quindi ho le coordinate del centro..dopodichè le coordinate dell'angolo in cima a sinistra dovranno essere rispettivamente centro-45 e centro+45..il ragionamento dovrebbe filare o no?

  10. #10
    Ma cos'è che non funziona??? Non viene al centro?
    Nerviamo nel cuore la Gnocca sempre, ma in Testa e sotto il Culo la Mia VESPA!!!

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.