Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    81

    Drag and Drop e java.lang.OutOfMemoryError

    Ciao, avrei due domande da farvi:

    1. Avete per caso qualche dritta da darmi su come si effettua il drag and drop di un'immagine contenuta in un'icone di una JLabel in un'altra?

    2. Ho implementato un operazione di zoom dell'immagine visualizzata, se la rimpicciolisco nessun problema, ma se aumento la dimensione(da zoomSelezionato==5 in poi) mi genera questa eccezione:

    Exception in thread "Image Fetcher 0" java.lang.OutOfMemoryError: Java heap space
    at java.awt.image.DataBufferInt.<init>(DataBufferInt. java:41)

    Ho letto che bisogna aumentare la dimensione dell'heap, ma le istruzioni erano solo da linea di comando, io utilizzo NetBeans.

    Il metodo utilizzato è il seguente:
    codice:
     public void actionPerformed(ActionEvent e) {
            Vista vista = this.controllo.getVista();
            SchermoPrincipale schermoPrincipale = (SchermoPrincipale) this.controllo.getVista().getSottoVista(Costanti.VISTA_SCHERMO_PRINCIPALE);
            int zoomSelezionato=schermoPrincipale.getZoomSelezionato();
            Image image = schermoPrincipale.getImageOriginale();
            int altezza=image.getHeight(vista);
            int larghezza = image.getWidth(vista);
            
            if(zoomSelezionato==1){
                image = image.getScaledInstance(larghezza/4, altezza/4, Image.SCALE_SMOOTH);
           
            }else if(zoomSelezionato == 2){
                image = image.getScaledInstance(larghezza/3, altezza/3, Image.SCALE_SMOOTH);
            }else if(zoomSelezionato == 3){
                 image = image.getScaledInstance(larghezza/2, altezza/2, Image.SCALE_SMOOTH);
            }else if(zoomSelezionato == 4){
                 image = image;
         
            }else if(zoomSelezionato == 5){
                 image = image.getScaledInstance(larghezza*10, altezza*10, Image.SCALE_SMOOTH);
            }else if(zoomSelezionato ==6){
                 image = image.getScaledInstance(larghezza*50, altezza*50, Image.SCALE_SMOOTH);
            }else if(zoomSelezionato == 7){
                 image = image.getScaledInstance(larghezza*75, altezza*75, Image.SCALE_SMOOTH);
            }else if(zoomSelezionato == 8){
                 image = image.getScaledInstance(larghezza*100, altezza*100, Image.SCALE_SMOOTH);
            }
            schermoPrincipale.aggiornaImmagine(image);
        }
    
    }
    ciao e grazie!!!!

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

    Re: Drag and Drop e java.lang.OutOfMemoryError

    Originariamente inviato da tina8
    1. Avete per caso qualche dritta da darmi su come si effettua il drag and drop di un'immagine contenuta in un'icone di una JLabel in un'altra?
    Proprio questa cosa l'avevo mostrata in questa discussione!

    Originariamente inviato da tina8
    2. Ho implementato un operazione di zoom dell'immagine visualizzata, se la rimpicciolisco nessun problema, ma se aumento la dimensione(da zoomSelezionato==5 in poi) mi genera questa eccezione:

    Exception in thread "Image Fetcher 0" java.lang.OutOfMemoryError: Java heap space
    at java.awt.image.DataBufferInt.<init>(DataBufferInt. java:41)

    Ho letto che bisogna aumentare la dimensione dell'heap, ma le istruzioni erano solo da linea di comando, io utilizzo NetBeans.
    Premesso che bisognerebbe vedere quali immagini stai trattando e di quali dimensioni .... se il problema è l'heap, quasi certamente NetBeans ha nelle "proprietà" del progetto la possibilità di impostare la dimensione del heap o comunque poter specificare opzioni particolari da passare alla JVM. Non conosco Netbeans .... magari guarda le proprietà del progetto che fai prima ..... anche solo per "cultura" tua personale, visto che se usi un IDE complesso dovresti cercare di conoscerlo il meglio possibile.
    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
    Apr 2009
    Messaggi
    72
    Puoi aumentare la dimensione dell'heap modificando il file etc/netbeans.conf.
    Guarda questo link: http://wiki.netbeans.org/FaqSettingHeapSize

  4. #4
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    81
    Ciao, ti ringrazio per i consigli, per quanto riguarda l'eccezione java.lang.OutOfMemoryError ho risolto diminuendo il valore dello zoom, tutto dipende in ogni caso dalla dimensione delle immagini da processare. Per quanto riguarda il drag and drop, ho provato a seguire la tua spiegazione, ma non accade assolutamente nulla.
    In pratica ho associato un MouseListener ad ogni JLabel nella mia JList ed un altro alla Jlabel principale, ma non va, ti posto il codice magari gli dai un'occhiata..grazie

    codice:
     public void inizializzaListaFileImmagini(){
          
              MouseListener mouseListener = new MouseAdapter ()
            {
                public void mousePressed (MouseEvent me)
                {
                    JComponent comp = (JComponent) me.getSource ();
                    TransferHandler handler = comp.getTransferHandler ();
                    handler.exportAsDrag (comp, me, TransferHandler.COPY);
                }
            };
            final int ALTEZZA = 100; //altezza delle icone
            int xW = 1;
       	int yW = 1;
     
            Sessione sessione = (Sessione) this.controllo.getModello().getBean(Costanti.SESSIONE);   
            ArrayList<Immagine> listaImmagini = sessione.getListaImmagini(); 
            Vector<JLabel> vector = new Vector<JLabel>();
            
            for(int i=0;i<listaImmagini.size();i++){
            Immagine immagine1 = (Immagine)listaImmagini.get(i);
            ImageIcon icona2 = new ImageIcon(immagine1.prelevaFileImmagine());
            Image image= icona2.getImage();
            if (icona2.getIconWidth() > 200) {
       			image = image.getScaledInstance(120,(icona2.getIconHeight() * 120)/icona2.getIconWidth(), 1);
       					icona2.setImage(image);
       				}
    	       
       				if (icona2.getIconHeight() > 200) {
       				image = image.getScaledInstance((icona2.getIconWidth() * 120)/icona2.getIconHeight(),120, 1);
       				
                                        icona2 = new ImageIcon(image);
       				}
          
       
             JLabel label = new JLabel(icona2); 
            label.setTransferHandler(new TransferHandler("icona2"));
            label.addMouseListener(mouseListener);
             vector.add(label);
            yW+=30;
       
        
            }
            labelImmagine.setTransferHandler(new TransferHandler("icona2"));
            labelImmagine.addMouseListener(mouseListener);
            
            this.listaImmagini.setListData(vector);
             this.listaImmagini.setCellRenderer (new MyLabelCellRenderer ());
            this.scrollPaneRiepilogoImmagini.add(this.listaImmagini);
            this.scrollPaneRiepilogoImmagini.setViewportView(this.listaImmagini);
            
          
        }
    In pratica ho una classe SchermoPrincipale che è un JPanel aggiunto in uno JScrollPane nel ContentPane del JFrame principale che ho chiamato Vista.
    All'interno dello SchermoPrincipale ho uno scrollPaneRiepilogoImmagini in cui ho aggiunto una JList di label, ed un altro scrollPaneImmagine in cui ho aggiunto una JLabel(labelImmagine) che inizializzo con l'immagine in dimensione orginale.
    Ciao!!!

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da tina8
    label.setTransferHandler(new TransferHandler("icona2"));

    labelImmagine.setTransferHandler(new TransferHandler("icona2"));
    Guarda che quello che passi al costruttore di TransferHandler non è una stringa da "sparare" a caso mettendo quello che ti pare! Quella stringa indica proprio la "proprietà" del componente da trasferire. E siccome in JLabel la proprietà per la icona si chiama "icon" (getIcon()/setIcon() sono i relativi getter/setter nei termini JavaBean), devi passare proprio "icon"!
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    81
    Ho modificato il codice ma continua a non funzionare..hai qualche idea in merito?

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.