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

    [Java][NetBeans]Problema con la path relativa di un file immagine

    Come da oggetto ho un problema con la path dell'immagine.

    Mi serve perché vorrei creare un jPanel con lo sfondo immagine (ho seguito i consigli di LeleFT).
    http://forum.html.it/forum/showthread/t-768848.html

    Se inserisco questo percorso è tutt'ok: "./src/..../immagine.jpg"
    Ma lanciando il file .jar generato con "Clean & Build" nella cartella /dist.. non trova più l'immagine (perché scompattando il .jar ho capito che l'immagine si trova sotto un'altra cartella, non più src).



    Allora ho provato a seguire strade alternative come recuperare il percorso con il metodo:
    Toolkit.getDefaultToolkit().createImage(path_immag ine);
    Ma anche qui mi viene richiesta come path_immagine "./src/..../immagine.jpg"

    xLeleFT.. sei lo stesso che frequentava il forum di Gambas?

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Il problema è che una volta impacchettato in un JAR, il file dell'immagine non può più essere recuperato in quel modo: perchè non è più un file, ma una risorsa e va caricato usando gli appositi metodi getResource() / getResourceAsStream() dell'oggetto Class.

    La ricerca delle risorse segue esattamente la ricerca delle classi lungo il classpath. Dai un'occhiata a questa discussione per capire come funzionano questi metodi.

    Per il PS: qual è il forum di Gambas?
    "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
    Ottimo LeleFT,

    sto guardando la spiegazione di Andrea.. Avevo capito che il problema era nel ClassPath.. ma come lo setto in NetBeans?

    La cosa che non mi riesce di capire è che ho scaricato un progetto dal sito Oracle/Java ed ho confrontato tutte le impostazioni con quelle del mio progetto.. ed ho usato lo stesso codice per importare l'immagine..
    Funziona tutto, ma se creo il Built.. l'app del sito carica l'immagine.. la mia app no..

    Il Tut in questione è questo.. Immagine in uno jSplitPane (io ho seguito la seconda parte del tutorial, quello con le due immagini a pannelli ridimensionabili)..
    http://docs.oracle.com/javase/tutori...splitpane.html

    Nel mio ClassPath mette anche una serie infinita di path relative ad Hibernate.. (è un gestionale)..

    PS. riguardo al forum di Gambas mi confondevo.. Poi sono andato a rileggere i miei precedenti msg su HTML.. ed ho visto che mi hai già aiutato qui in passato! Monumentale!!
    Ultima modifica di perseoclub; 22-10-2013 a 13:10

  4. #4
    Allora il classpath può c'entrare oppure no.
    Il primo controllo da fare è la tua immagine è inclusa nel jar ?
    Supponendo che sia in src/package/name/miaImg.jpg
    allora nel tuo codice per caricarla correttamente dovresti avere qualcosa del genere (pseudo codice non compila):
    codice:
    public class MiaClasse
    {
       public void mioMetodo()
       {
           URL mioUrl = MiaClasse.class.getResource("/package/name/miaImg.jpg");
           ImageIcon icon = new ImageIcon(mioUrl);
        }
    }

  5. #5
    Per semplicità ho tolto tutto il codice autogenerato da NetBeans..

    Questo è il mio Jpanel..

    codice:
    package provaimmaginejpanel.ui;
    
    import java.awt.Graphics;
    import java.awt.Image;
    import java.awt.Toolkit;
    import java.net.URL;
    
    public class MyJPanel extends javax.swing.JPanel {
        
        private Image img;
    
        public MyJPanel() {
            initComponents();
            URL mioUrl = MyJPanel.class.getResource("images/miaimmagine.jpg");
            System.out.println(mioUrl.toString());
            Image img = Toolkit.getDefaultToolkit().createImage(mioUrl.toString());
        }
        
        @Override
        public void paintComponent(Graphics page) {
            super.paintComponent(page);
            page.drawImage(img, 0, 0, null);
        }                     
                   
    }

    Questa è la mia JFrame main..

    codice:
    package provaimmaginejpanel.ui;
    
    public class MyJFrame extends javax.swing.JFrame {
    
        public MyJFrame() {
            initComponents();
        }
    
        public static void main(String args[]) {
            java.awt.EventQueue.invokeLater(new Runnable() {
                public void run() {
                    MyJPanel pan = new MyJPanel();
                    MyJFrame frm = new MyJFrame();
                    frm.add(pan);
                    frm.setVisible(true);
                }
            });
        }
                       
    }

    Se faccio il RUN dell'applicazione NetBeans.. questo è l'output:

    run:
    file:/home/.../NetBeansProjects/ProvaImmagineJPanel/build/classes/provaimmaginejpanel/ui/images/miaimmagine.jpg
    BUILD SUCCESSFUL (total time: 5 seconds)


    ..ed il frame mi appare senza l'immagine di sfondo..


  6. #6
    Allora,

    non so perché.. ma ho risolto..

    Ho preso spunto da questo link:
    http://www.coderanch.com/how-to/java...dImageOnJPanel

    codice:
    package imagetest;
    
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.Image;
    import java.net.URL;
    import javax.imageio.ImageIO;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    
    public class ImageTest {
    
      public static void main(String[] args) {
        ImagePanel panel = new ImagePanel("miaimmagine.jpg");
        JFrame frame = new JFrame();
        frame.add(panel);
        frame.setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        Dimension size = new Dimension(600, 400);
        frame.setSize(size);
        frame.setVisible(true);
      }
    
    }
    
    
    class ImagePanel extends JPanel {
     
      private Image img;
      private URL Url_img;
    
      public ImagePanel(String path) {
          try {
              URL Url_img = new URL(ImageTest.class.getResource("images/"+path), path);
              System.out.println(Url_img.toString());
              img = ImageIO.read(Url_img);
          }
          catch (Exception e) { /*handled in paintComponent()*/ }
      }
    
      @Override
      public void paintComponent(Graphics g) {
        g.drawImage(img, 0, 0, null);
      }
    }

    In pratica ho usato il metodo:
    img =ImageIO.read(Url_img);
    .. ed ho capito che l'indirizzo andava gestito diversamente.. come sopra.. (ho aggiunto a mano la cartella "images/" dove c'è l'immagine..).


    PS:
    Perché invece il metodo..
    Image img =Toolkit.getDefaultToolkit().createImage(mioUrl.to String());
    ..mi dava tanti problemi?

    Appena capisco il motivo.. aggiungo in cima al thread [risolto]
    Ultima modifica di perseoclub; 23-10-2013 a 01:05

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.