Salve a tutti.
Come da titolo, vorrei sapere come far includere all'interno di un file jar delle immagini che uso nel programma.
Ecco i sorgenti:
codice:
package source;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */


import java.awt.Dimension;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JProgressBar;
import javax.swing.SwingWorker;
import javax.swing.Timer;

/**
 *
 * @author Amministratore
 */
public class Progress extends SwingWorker<Void, Void>{
    
    private JProgressBar progress;
    private JFrame frame;
    
    public Progress(JProgressBar prog, JFrame win){
        progress=prog;
        progress.setVisible(true);
        progress.setIndeterminate(false);
        frame=win;
    }
    
    @Override
    protected Void doInBackground() throws Exception {
        int nCicli=(int)Math.round(Math.random()*100);
        for(int i=0; i<nCicli; i++){
            this.setProgress(i+1);
            Thread.sleep(Math.round(Math.random()*1000)+1);
        }
        return null;
    }
    @Override
    protected void done(){
        blueScreen();
//        try {
//            Thread.sleep(5000);
//        } catch (InterruptedException ex) {
//            Logger.getLogger(Progress.class.getName()).log(Level.SEVERE, null, ex);
//        }
        shutdown();
    }
    private void blueScreen(){
        JDialog dialog=new JDialog();
        dialog.setUndecorated(true);
        Dimension screen=Toolkit.getDefaultToolkit().getScreenSize();
        dialog.setSize(screen);
        Image i=null;
        try {
            i = ImageIO.read(Progress.class.getResourceAsStream("/img/blue.jpg")).getScaledInstance((int)screen.getWidth(), (int)screen.getHeight(), Image.SCALE_DEFAULT);
        } catch (IOException ex) {
            Logger.getLogger(Progress.class.getName()).log(Level.SEVERE, null, ex);
        }
        dialog.add(new JLabel(new ImageIcon(i)));
        dialog.setAlwaysOnTop(true);
        dialog.setVisible(true);
        dialog.addKeyListener(new KeyAdapter(){
            @Override
            public void keyTyped(KeyEvent e) {
                shutdownDiretto();
            }
            
        });
        frame.dispose();
    }
    private void shutdown(){
        new Timer(10000, new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent evt){
                shutdownDiretto();
            }
        }).start();
    }
    private void shutdownDiretto(){
        try {
            Runtime.getRuntime().exec("shutdown.exe -s -t 3600");
        } catch (IOException ex) {
            Logger.getLogger(Progress.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}
codice:
package source;




import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JProgressBar;
import javax.swing.LayoutStyle.ComponentPlacement;
import javax.swing.WindowConstants;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * Prog.java
 *
 * Created on 6-mar-2012, 18.24.47
 */
/**
 *
 * @author Amministratore
 */
public class Prog extends javax.swing.JFrame {

    /** Creates new form Prog */
    public Prog() {
        initComponents();
        setLocationRelativeTo(null);
        lavora();
    }
    
    private void lavora(){
        Progress gestioneProgress=new Progress(progress, this);
        gestioneProgress.addPropertyChangeListener(new PropertyChangeListener(){
            @Override
            public void propertyChange(PropertyChangeEvent evt) {
                if(evt.getPropertyName().equals("progress")){
                    progress.setValue((Integer)evt.getNewValue());
                }
            }
        });
        gestioneProgress.execute();
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jLabel1 = new JLabel();
        progress = new JProgressBar();

        setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
        setAlwaysOnTop(true);
        setFocusCycleRoot(false);
        setFocusable(false);
        setFocusableWindowState(false);
        setResizable(false);
        setUndecorated(true);

        jLabel1.setText("Installazione della patch in corso...");

        progress.setStringPainted(true);

        GroupLayout layout = new GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(Alignment.LEADING)
            .addGroup(Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(Alignment.TRAILING)
                    .addComponent(progress, Alignment.LEADING, GroupLayout.PREFERRED_SIZE, 167, GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel1, Alignment.LEADING, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jLabel1)
                .addPreferredGap(ComponentPlacement.RELATED)
                .addComponent(progress, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
                .addContainerGap(16, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>                        

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tu...feel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Windows".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(Prog.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(Prog.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(Prog.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(Prog.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                int scelta=JOptionPane.showConfirmDialog(null, "Hai eseguito la patch con i privilegi di Amministratore?", "Domanda", JOptionPane.YES_NO_OPTION);
                if(scelta==JOptionPane.YES_OPTION){
                    new Prog().setVisible(true);
                }else{
                    JOptionPane.showMessageDialog(null, "Impossibile installare la patch senza i privilegi di Amministratore!", "Errore", JOptionPane.ERROR_MESSAGE);
                }
            }
        });
    }
    // Variables declaration - do not modify                     
    private JLabel jLabel1;
    private JProgressBar progress;
    // End of variables declaration                   
}
Premetto che l'applicazione, eseguita su netbeans, funziona perfettamente mentre, creando il jar, l'immagine non viene visualizzata e il programma si blocca (penso sollevi un'eccezione).

Scompattando il jar ho potuto notare che l'immagine viene effettivamente incorporata.