Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    Programma per disegnare figure geometriche di base

    Buonasera a tutti, sono alle prime armi con Java e sto tentando, in poche parole, di creare una finestra, all'interno della quale vi sia un JButton e un'area di disegno. Cliccando sul JButton la figura (geometrica di base) deve cambiare da rettangolo a cerchio. Il mio codice non funziona, ve lo posto qui:
    La finestra
    codice:
    import java.awt.BorderLayout;
    import java.awt.FlowLayout;
    import java.awt.GridLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.io.ObjectInputStream.GetField;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    
    public class Finestra extends JPanel{
        public static void main(String[] args) {
            JFrame window = new JFrame("Finestra");
            window.setLayout(new FlowLayout());
            window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            
            window.setSize(500, 500);
            
            
            JButton Ridisegna = new JButton("Cambia figura");
            
             Ridisegna.addActionListener(new ActionListener() {
             Rettangolo rettangolo = new Rettangolo();
                @Override
                public void actionPerformed(ActionEvent e) {
       
                    window.getContentPane().removeAll();
                    window.getContentPane().add(rettangolo);
                    //window.getContentPane().validate();
                }
            });
            //window.getContentPane().add(new Rettangolo());
            
            window.add(Ridisegna);
            window.setVisible(true);
            
          }
    }
    Il codice per disegnare il rettangolo
    codice:
    import java.awt.Color;
    import java.awt.Graphics;
    
    import javax.swing.JComponent;
    
    
    public class Rettangolo extends JComponent{
    
            public void paint(Graphics g) {
                super.paintComponent(g);
                g.drawRect (10, 10, 200, 200);
                //g.setColor(Color.red);
            }
    
    }

    e infine quello che disegna il cerchio...

    codice:
    import java.awt.Graphics;
    
    import javax.swing.JComponent;
    import javax.swing.JPanel;
    
    public class Cerchio extends JComponent{
         public void cerchio(Graphics g) {
             super.paintComponent(g);
                g.drawOval (10, 10, 200, 200);  
              }
    }
    Per facilitare la comprensione del codice, in particolare di dove sia l'inizio e la fine delle classi ho messo titoli in neretto...

    Grazie per l'aiuto,
    ciao a tutti!
    e Buone feste!

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Java ha una sezione dedicata.
    Ho spostato la discussione.

    PS: cosa vuol dire, con precisione, "Il mio codice non funziona"? Non compila? Non esegue? Lancia delle eccezioni? Se sì, quali? Fa cose che non dovrebbe fare? Se sì, cosa?


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Quote Originariamente inviata da LeleFT Visualizza il messaggio
    Java ha una sezione dedicata.
    Ho spostato la discussione.

    PS: cosa vuol dire, con precisione, "Il mio codice non funziona"? Non compila? Non esegue? Lancia delle eccezioni? Se sì, quali? Fa cose che non dovrebbe fare? Se sì, cosa?


    Ciao.
    Lancio l'applicazione, si apre il JFrame con il Jbutton, ma come premo il pulsante si blocca tutto!

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Quel codice non compila nemmeno (evidentemente non lo hai copiato bene nel forum):

    codice:
    Finestra.java:28: local variable window is accessed from within inner class; needs to be declared final
                    window.getContentPane().removeAll();
                    ^
    Finestra.java:29: local variable window is accessed from within inner class; needs to be declared final
                    window.getContentPane().add(rettangolo);
                    ^
    2 errors

    L'errore si risolve facilmente imponendo, appunto, alla variabile "window" di essere final.

    Ad ogni modo il problem è chiaro: stai chiedendo alla finestra di rimuovere tutti i suoi componenti, ma le stai chiedendo di farlo proprio da uno dei suoi componenti. Che, quindi, non può più essere ridisegnato (e ti sembra, appunto, bloccato).

    Il pulsante è contenuto nella finestra e chiede alla finestra di rimuovere tutti i suoi componenti, quindi anche sé stesso. La finestra, quindi, rimuove il pulsante, ma nessuno le dice di ridisegnarsi dopo questa operazione.

    Prova ad aggiungere queste due istruzioni, subito dopo il removeAll() e vedrai sparire il pulsante (giustamente):

    codice:
       window.getContentPane().doLayout();
       window.getContentPane().repaint();

    Devi rivedere meglio il design, perchè non è esattamente ciò che tu vuoi che faccia.

    PS: dovresti anche imporre una dimensione agli oggetti Cerchio e Rettangolo... così come sono vengono creati senza alcuna dimensione, quindi non verrebbero proprio disegnati. Suggerimento: usa un costruttore e al suo interno chiama un setSize().

    Ciao.
    Ultima modifica di LeleFT; 30-12-2014 a 19:31
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Io aggiungo che in Swing si dovrebbe ridefinire paintComponent(Graphics) .... non paint(Graphics).
    E inoltre in Cerchio un public void cerchio(Graphics g) non ha senso.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Io aggiungo che in Swing si dovrebbe ridefinire paintComponent(Graphics) .... non paint(Graphics).
    E inoltre in Cerchio un public void cerchio(Graphics g) non ha senso.
    Sì, infatti... non avevo nemmeno letto la classe Cerchio e mi sono dimenticato di puntualizzare sul paintComponent (avevo una certa fretta di scappare dall'ufficio ).


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

Tag per questa discussione

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.