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.
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); } }