Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 25
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2014
    Messaggi
    305

    Java Riquadro per inserire foto

    Salve avrei bisogno di un riquadro in cui inserire foto!! Esempio :
    un frame e all'interno questo riquadro , in modo tale che quando ci clicco , mi si avvia un filechooser, seleziono la foto, e questa viene caricata nel riquadro.. Sapreste dirmi che componente posso usare?
    Qualcosa tipo, quei riquadri che quando ci vado su compare al posto della freccetta del mouse la manina , tipo ipertesto.
    Grazie

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da linux_r Visualizza il messaggio
    Salve avrei bisogno di un riquadro in cui inserire foto!! Esempio :
    un frame e all'interno questo riquadro , in modo tale che quando ci clicco , mi si avvia un filechooser, seleziono la foto, e questa viene caricata nel riquadro.. Sapreste dirmi che componente posso usare?
    Qualcosa tipo, quei riquadri che quando ci vado su compare al posto della freccetta del mouse la manina , tipo ipertesto.
    Grazie
    Potrebbe forse bastarti un banale JLabel, su cui registri un MouseListener e al mouseClicked usi il file chooser. Per quanto riguarda l'aspetto del riquadro, es. sfondo, bordo, cursore, tutti questi sono facilmente configurabili.

    Se vuoi fare la cosa in modo più "pulito" e anche magari facilmente riutilizzabile, incapsuli tutto in un tuo pannello es. RiquadroFoto che estende JPanel.
    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
    Jan 2014
    Messaggi
    305
    quindi estendo JPanel e creo come variabile d'istanza nella mia classe una JLabel esatto ?
    Volevo inoltre chiederti posso riusare questa classe tra gli strumenti dell'editor grafico di netbeans?
    Ultima modifica di linux_r; 20-06-2014 a 08:06

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da linux_r Visualizza il messaggio
    quindi estendo JPanel e creo come variabile d'istanza nella mia classe una JLabel esatto ?
    Grosso modo sì. Però bisognerebbe valutare alcune cose riguardo dimensionamenti e eventuale scrollabilità della immagine.
    Ad esempio: vuoi che la dimensione "preferita" del tuo pannello-riquadro sia la stessa della label (e quindi dipendente dalla icona-immagine inserita)? Questo serve principalmente in base al layout-manager in cui si inserisce il tuo pannello.
    Vuoi che nel tuo pannello ci sia un JScrollPane per poter scrollare la immagine se chi dimensiona il tuo pannello lo rende più piccolo della immagine?

    Quote Originariamente inviata da linux_r Visualizza il messaggio
    Volevo inoltre chiederti posso riusare questa classe tra gli strumenti dell'editor grafico di netbeans?
    Non lo so ... primo perché NetBeans al momento non lo uso e, secondo, perché se anche lo usassi scriverei comunque tutto il codice GUI "a mano", che non ho problemi in tal senso.

    Da una veloce ricerca, vedo che ne parlano ad esempio qui: http://stackoverflow.com/questions/8...ns-gui-builder
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2014
    Messaggi
    305
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Grosso modo sì. Però bisognerebbe valutare alcune cose riguardo dimensionamenti e eventuale scrollabilità della immagine.
    Ad esempio: vuoi che la dimensione "preferita" del tuo pannello-riquadro sia la stessa della label (e quindi dipendente dalla icona-immagine inserita)? Questo serve principalmente in base al layout-manager in cui si inserisce il tuo pannello.
    Vuoi che nel tuo pannello ci sia un JScrollPane per poter scrollare la immagine se chi dimensiona il tuo pannello lo rende più piccolo della immagine?
    Mi è sufficiente che l'immagine si adatti al pannello , quindi le dimensioni del pannello si dovrebbero adattare poi in base al layout del frame in cui è inserito!!

  6. #6
    Utente di HTML.it
    Registrato dal
    Jan 2014
    Messaggi
    305
    fatto ! però resta il problema che se ingrandisco il frame l'immagine non si ridimensiona!! come posso fare? ti posto il codice :
    codice:
    
    package jCallRemember.libreria;
    
    
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Image;
    import java.awt.Toolkit;
    import java.awt.event.MouseListener;
    import java.io.File;
    import java.io.IOException;
    import javax.swing.ImageIcon;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    
    
    /**
     *
     * @author Linux
     */
    public class RiquadroFoto  extends JPanel{
        private JLabel labelFoto;
        private File fileFoto;
      
        public RiquadroFoto() {
            this.labelFoto=new JLabel();
            this.initComponents();
        }
        
        private void initComponents(){
            this.setLayout(new BorderLayout());
            this.add(labelFoto,BorderLayout.CENTER);
            this.setBackground(Color.white);
            
        }
        
        
    
    
        
        public void impostaMouseClick(MouseListener M){
            this.labelFoto.addMouseListener(M);
        }
    
    
        void inserisciFoto(File fileSelezionato) throws IOException {
            this.fileFoto=fileSelezionato;
            Image im=Toolkit.getDefaultToolkit().getImage(this.fileFoto.getCanonicalPath());
            Dimension dim=this.getPreferredSize();
            this.labelFoto.setIcon(new ImageIcon(im.getScaledInstance(dim.width, dim.height, Image.SCALE_SMOOTH)));
        }
        
    
    
        
    }
    codice:
    package jCallRemember.libreria;
    
    
    import java.awt.BorderLayout;
    import java.awt.Dimension;
    import javax.swing.JFrame;
    
    
    /**
     *
     * @author Linux
     */
    public class FormInsertOperatore extends JFrame{
        private RiquadroFoto riquadro;
        
        public FormInsertOperatore(){
            riquadro=new RiquadroFoto();
        }
        
        public void setup(){
            this.add(riquadro,BorderLayout.CENTER);
            this.riquadro.setPreferredSize(new Dimension(150,150));
            this.pack();
            this.setVisible(true);
            this.riquadro.impostaMouseClick(new ClickRiquadroFoto(this.riquadro));
        }
        
        
    }
    epoi c'è quello del click ma non penso ti interessi !

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da linux_r Visualizza il messaggio
    però resta il problema che se ingrandisco il frame l'immagine non si ridimensiona!!
    Credo di aver capito a cosa ti riferisci ma ... preferisco spiegarti bene cosa succede nel tuo codice.

    Hai messo 'riquadro' nella parte CENTER del BorderLayout di JFrame (del content pane, per essere corretti). Poi hai dato una dimensione "preferita" di 150x150 a 'riquadro'. Il pack() utilizza questa dimensione preferita, perché fa in modo che tutti i sotto-componenti siano alla loro dimensione preferita.

    Ma se ridimensioni il frame, la dimensione "fisica" del tuo riquadro dipende direttamente e solo dal frame. Non viene più sfruttata la dimensione preferita (che comunque come valore resta a 150x150).


    Inoltre aggiungo anche un'altra cosa: il getImage() di Toolkit usa un sistema di "cache" delle immagini. A parità di filename/url, restituisce lo stesso oggetto Image già precedentemente fornito. Se l'immagine nel frattempo è cambiata (il file è stato aggiornato), quando richiedi lo stesso filename/url ottieni la vecchia immagine in cache in memoria.
    Ci sono sostanzialmente 2 soluzioni a questo: "flushare" la immagine con il suo flush() oppure usare createImage() di Toolkit, che non usa alcun meccanismo di caching.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    Utente di HTML.it
    Registrato dal
    Jan 2014
    Messaggi
    305
    ti ringrazio però resta il fatto che non so come far ridimensionare l'immagine , quando ridimensiono il frame!

  9. #9
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da linux_r Visualizza il messaggio
    ti ringrazio però resta il fatto che non so come far ridimensionare l'immagine , quando ridimensiono il frame!
    Volendo continuare ad usare un JLabel e un ImageIcon, dovresti registrare su RiquadroFoto un ComponentListener. All'evento componentResized prendi la dimensione "reale", fisica del riquadro (getSize o getWidth+getHeight) e ridimensioni la immagine, crei un nuovo ImageIcon e lo risetti nel JLabel. Chiaramente la immagine originale (così com'era stata caricata) la devi tenere da parte, in un campo di istanza intendo).

    Un'altra soluzione sarebbe il custom painting. Ovvero niente JLabel/ImageIcon. Fai il paint "stretchato" della immagine ogni volta che il RiquadroFoto viene ridisegnato dal framework. Ma potrebbe risultare meno performante.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  10. #10
    Utente di HTML.it
    Registrato dal
    Jan 2014
    Messaggi
    305
    Cosa ne pensi se uso paintComponent(graphics g)
    codice:
    package jCallRemember.libreria;
    
    
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.Image;
    import java.awt.Toolkit;
    import java.awt.event.MouseListener;
    import java.io.File;
    import java.io.IOException;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    import javax.swing.ImageIcon;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    
    
    /**
     *
     * @author Linux
     */
    public class RiquadroFoto  extends JPanel{
        private JLabel labelFoto;
        private File fileFoto;
        private Image foto;
        public RiquadroFoto() {
            this.labelFoto=new JLabel();
            this.setLayout(new BorderLayout());
            this.add(labelFoto,BorderLayout.CENTER);
        }
        
        public void initComponents(){
            
            this.labelFoto.setPreferredSize(this.getPreferredSize());
            this.setBackground(Color.white);
            
        }
        
        
    
    
        
        public void impostaMouseClick(MouseListener M){
            this.labelFoto.addMouseListener(M);
        }
    
    
        public void inserisciFoto(File fileSelezionato) throws IOException {
            this.fileFoto=fileSelezionato;
            this.foto=Toolkit.getDefaultToolkit().createImage(this.fileFoto.getCanonicalPath());
            Dimension dim=this.getPreferredSize();
            this.labelFoto.setIcon(new ImageIcon(foto.getScaledInstance(dim.width, dim.height, Image.SCALE_SMOOTH)));
        }
     
        @Override
        public void paintComponent(Graphics g) {
            super.paintComponents(g);
            Dimension dim=new Dimension(this.getPreferredSize());
            this.labelFoto.setPreferredSize(dim);
            if(foto!=null)
                this.labelFoto.setIcon(
                        new ImageIcon(foto.getScaledInstance(dim.width, dim.height,
                                Image.SCALE_SMOOTH))
                );
        }
        
    }
    codice:
         package jCallRemember.libreria;
    
    
    import java.awt.BorderLayout;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.event.ComponentAdapter;
    import java.awt.event.ComponentEvent;
    import javax.swing.JFrame;
    
    
    /**
     *
     * @author Linux
     */
    public class FormInsertOperatore extends JFrame{
        private final RiquadroFoto riquadro;
        
        public FormInsertOperatore(){
            riquadro=new RiquadroFoto();
        }
        
        public void setup(){
            this.setPreferredSize(new Dimension(150,150));
            this.riquadro.setPreferredSize(new Dimension(150,150));
            this.add(riquadro,BorderLayout.CENTER);
            
            this.pack();
            this.setVisible(true);
            this.riquadro.impostaMouseClick(new ClickRiquadroFoto(this.riquadro));
            this.addComponentListener(new ComponentAdapter(){
                @Override
                public void componentResized(ComponentEvent e){
                    riquadro.setPreferredSize(getSize());
                    
                }
            });
        }
       
    
    
    
    
    
    
    
    
    }

    Unico problema iljpanel non viene piu colorato di bianco adesso . perchè?

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.