Carregando o erro de recurso do ícone

No Eclipse, quando executo o código, isso funciona:

import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; public class Main { public static void main(String[] args) { JFrame frame = new JFrame("test viewing images"); frame.setSize(600,300); frame.setLocationRelativeTo(null); // centered on monitor frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); /** * Menu Bar stuff */ JMenuBar menuBar; JMenu menu; JMenuItem menuItem; // MENU BAR menuBar = new JMenuBar(); frame.setJMenuBar(menuBar); menuBar.setVisible(true); // MENU 1 menu = new JMenu("File"); menuBar.add(menu); // MENU 1 ITEM ImageIcon icon = new ImageIcon("src/Action-exit-icon.png"); menuItem = new JMenuItem("Exit Program", icon); menu.add(menuItem); frame.setVisible(true); } } 

E aqui está a estrutura de arquivos do meu Package Explorer:

 ShowImage (project) > src / Main.java > src / Action-exit-icon.png 

Além disso, esta área de trabalho está localizada em Z: \ eclipse_projects

Eu posso ver o ícone ImageIcon = new ImageIcon (“src / Action-exit-icon.png”); está funcionando bem, e o menuBar faz seu trabalho.

Agora vamos exportar este projeto e eu enviarei o JAR por e-mail para um amigo meu.

  1. Clique com o botão direito do mouse em projeto> selecione Exportar
  2. Selecione Java> Arquivo JAR Executável
  3. Eu escolho o arquivo principal na configuração de boot
  4. Destino de exportação: minha área de trabalho
  5. Manipulação de bibliotecas: extrair bibliotecas necessárias no JAR gerado
  6. vá para a minha área de trabalho, dê um duplo clique no ShowImage.jar

O JFrame aparece, mas o Action-exit-icon.png não está aparecendo.

Quando abro o ShowImage.jar, para ver seu conteúdo, vejo o Main.class, Action-exit-icon.png, META-INF.

Ok, estou seriamente confuso sobre como referenciar uma imagem ou qualquer recurso agora. O que estou fazendo de errado?

 new ImageIcon("src/Action-exit-icon.png"); 

O construtor String para um ImageIcon presume a string para representar um caminho de File .

Essa imagem é obviamente um recurso de aplicativo e se tornará um recurso incorporado no momento da implantação (em um Jar). Portanto, ele deve ser acessado por URL partir do caminho de class de tempo de execução do aplicativo, assim:

 new ImageIcon(getClass().getResource("/src/Action-exit-icon.png")); 

Revendo o código, eu entendo isso:

 import java.awt.Color; import javax.swing.*; public class JavaGui148 { public JComponent getGUI() { JPanel p = new JPanel(); p.setBackground(Color.GREEN); return p; } public JMenuBar getMenuBar() { /** * Menu Bar stuff */ JMenuBar menuBar; JMenu menu; JMenuItem menuItem; // MENU BAR menuBar = new JMenuBar(); menuBar.setVisible(true); // MENU 1 menu = new JMenu("File"); menuBar.add(menu); // MENU 1 ITEM ImageIcon icon = new ImageIcon(getClass().getResource( "/src/Action-exit-icon.png")); menuItem = new JMenuItem("Exit Program", icon); menu.add(menuItem); return menuBar; } public static void main(String[] args) { Runnable r = new Runnable() { @Override public void run() { JavaGui148 gui = new JavaGui148(); JFrame f = new JFrame("Demo"); f.setJMenuBar(gui.getMenuBar()); f.add(gui.getGUI()); // Ensures JVM closes after frame(s) closed and // all non-daemon threads are finished f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); // See http://stackoverflow.com/a/7143398/418556 for demo. f.setLocationByPlatform(true); // ensures the frame is the minimum size it needs to be // in order display the components within it f.pack(); // should be done last, to avoid flickering, moving, // resizing artifacts. f.setVisible(true); } }; // Swing GUIs should be created and updated on the EDT // http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html SwingUtilities.invokeLater(r); } } 
Intereting Posts