Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2004
    Messaggi
    51

    Problema con Graphics2D

    Salve, sto iniziando ad affrontare il disegno con java, disegno una semplice ellisse.
    con il seguente codice:
    codice:
    import java.awt.*;
    import java.awt.geom.*;
    import javax.swing.*;
     
    public class Graf02 {   
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    JFrame f = new JFrame("Disegno un ellisse");
                    f.setBounds(800, 500, 300, 300);
                    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
                    f.add(new MyComp());
                    f.setVisible(true);          
                }
            });
        }
    }
    class MyComp extends JComponent{
       final static BasicStroke spessore = new BasicStroke(5.0f);
       public void paintComponent(Graphics g) {      
           Graphics2D g2d =(Graphics2D)g;
           g2d.setStroke(spessore);
           Ellipse2D.Double fc = new Ellipse2D.Double(50,30,100,150);
           g2d.draw(fc);
       }
    }

    E funziona perfettamente.
    Ho provato a fare la stessa cosa ma utilizzando un JFrame esterno.

    Ossia un sorgente principale Graf03.java:
    codice:
    import java.awt.*;
    import java.awt.geom.*;
    import javax.swing.*;
     
    public class Graf03 {
       
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    xJFrame f = new xJFrame();
                    f.getContentPane().add(new MyComp());
                    //f.add(new MyComp());
                    f.setVisible(true);
                }
            });
        }
    }
     
    class MyComp extends JComponent{
       final static BasicStroke spessore = new BasicStroke(5.0f);
       public void paintComponent(Graphics g) {      
           Graphics2D g2d =(Graphics2D)g;
           g2d.setStroke(spessore);
           Ellipse2D.Double fc = new Ellipse2D.Double(50,30,100,150);
           g2d.draw(fc);
       }
    }

    Ed un xJFrame.java esterno dove c'è il frame:
    codice:
    import java.awt.*;
    import javax.swing.*;
     
    public class xJFrame extends JFrame {       
        public xJFrame() {    
            setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
            setTitle("Sono una x");
            setBounds(new java.awt.Rectangle(800, 500, 300, 300));
            setPreferredSize(new Dimension(300, 300));
            getContentPane().setLayout(null);      
            pack();
        } 
    
    }

    MI visualizza la finestra ma dell'ellisse non vi è traccia!
    Dov'è che sbaglio?
    Sarebbe utile avere il JFrame a parte in modo da poterlo generare automaticamente in Netbeans.
    Grazie per l'eventuale aiuto.

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da cersil Visualizza il messaggio
    MI visualizza la finestra ma dell'ellisse non vi è traccia!
    Dov'è che sbaglio?
    Qui:

    getContentPane().setLayout(null);

    Hai tolto il layout manager ma il tuo new MyComp() ha per default una dimensione di 0x0. Quando invece c'era il BorderLayout predefinito del content-pane, il componente andava ad occupare implicitamente tutta la parte CENTER del content-pane.


    Alcune note:

    1) Il paintComponent tienilo protected . E mettigli @Override . E come prima cosa dovrebbe fare un:

    super.paintComponent(g);


    2) A partire dal JDK 5, se f è un JFrame(/JDialog), allora fare

    f.add(unComponente);

    oppure

    f.getContentPane().add(unComponente);

    è la stessa cosa. Dal JDK 5 il add del JFrame fa un "forward" sul add del content-pane.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2004
    Messaggi
    51
    Grandioso, non ci sarei mai arrivato. Grazie infinite per la pazienza.

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2004
    Messaggi
    51
    Riflettendoci su. Se volessi mantenete il layout manager = null nel frame, potrei portare le dimensioni del JPanel da 0x0 a:
    codice:
    class MyComp extends JPanel{
       public MyComp(){
          setBounds(0, 0, 300, 300);
       }
       final static BasicStroke spessore = new BasicStroke(5.0f);
       @Override
       protected void paintComponent(Graphics g) { 
           super.paintComponent(g);
           Graphics2D g2d =(Graphics2D)g;
           g2d.setStroke(spessore);
           Ellipse2D.Double fc = new Ellipse2D.Double(50,30,100,150);
           g2d.draw(fc);
       }
    }
    con setBounds(0, 0, 300, 300); e la cosa funziona però sono stato costretto ad usare il JPanel al posto del JComponent in quanto sembra che non ci sia per questo un metodo che permetta di dimensionarlo.

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2004
    Messaggi
    51
    Mi correggo setBounds funziona anche su jComponente anche se sul reference java non c'è questo metodo per jComponent Bah!?

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da cersil Visualizza il messaggio
    Mi correggo setBounds funziona anche su jComponente anche se sul reference java non c'è questo metodo per jComponent Bah!?
    Quel setBounds esiste per TUTTI i componenti AWT e Swing. È definito originariamente in java.awt.Component .
    E comunque lo devi usare solo se il contenitore non ha un layout-manager.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2004
    Messaggi
    51
    GRazie

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.