简体   繁体   English

为什么我的JFrame图像没有更改图标?

[英]Why is my JFrame image not changing the icon?

I am trying to change the image icon on a JFrame and it is not showing up. 我正在尝试更改JFrame上的图像图标,但它没有显示。 I have tried both the absolute path to my desktop and then the path that I have in Eclipse. 我尝试了到桌面的绝对路径,然后再尝试了Eclipse中的路径。 Why is this not working. 为什么这不起作用。 I have looked on stackoverflow and this is how it looks like that it is probably done, but for some reason the code below is not working. 我已经看过stackoverflow,这大概是完成的样子,但是由于某些原因,下面的代码无法正常工作。

code: 码:

package TestMenu;

import java.awt.EventQueue;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

public class TestJFrame extends JFrame {
    private static final long serialVersionUID = 1L;
    private JPanel contentPane;

    public TestJFrame() {
        ImageIcon img = new ImageIcon("C:\\Users\\itpr13266\\workspace\\TestMenu\\src\\TestMenu\\img\\s.jpg");
        setIconImage(img.getImage());

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);

        JPanel panel = new JPanel();
        panel.setBounds(117, 105, 10, 10);
        contentPane.add(panel);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    TestJFrame frame = new TestJFrame();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
}

No exception was thrown. 没有异常被抛出。

The code is fix now. 该代码现已修复。 I had the wrong image format type. 我的图像格式类型错误。

Code that does not work: 无效的代码:

import java.awt.*;
import java.awt.event.*;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JRadioButtonMenuItem;
import javax.swing.ButtonGroup;
import javax.swing.JMenuBar;
import javax.swing.KeyStroke;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JScrollPane;
import javax.swing.JFrame;

public class MenuLookDemo {
    JTextArea output;
    JScrollPane scrollPane;

    public JMenuBar createMenuBar() {
        JMenuBar menuBar;
        JMenu menu, submenu;
        JMenuItem menuItem;
        JRadioButtonMenuItem rbMenuItem;
        JCheckBoxMenuItem cbMenuItem;

        menuBar = new JMenuBar();

        menu = new JMenu("A Menu");
        menu.setMnemonic(KeyEvent.VK_A);
        menu.getAccessibleContext().setAccessibleDescription(
                "The only menu in this program that has menu items");
        menuBar.add(menu);

        menuItem = new JMenuItem("A text-only menu item",
                                 KeyEvent.VK_T);
        //menuItem.setMnemonic(KeyEvent.VK_T); //used constructor instead
        menuItem.setAccelerator(KeyStroke.getKeyStroke(
                KeyEvent.VK_1, ActionEvent.ALT_MASK));
        menuItem.getAccessibleContext().setAccessibleDescription(
                "This doesn't really do anything");
        menu.add(menuItem);

        ImageIcon icon = createImageIcon("src\\TestMenu\\img\\stop.jpg");
        menuItem = new JMenuItem("Both text and icon", icon);
        menuItem.setMnemonic(KeyEvent.VK_B);
        menu.add(menuItem);

        menuItem = new JMenuItem(icon);
        menuItem.setMnemonic(KeyEvent.VK_D);
        menu.add(menuItem);

        //a group of radio button menu items
        menu.addSeparator();
        ButtonGroup group = new ButtonGroup();

        rbMenuItem = new JRadioButtonMenuItem("A radio button menu item");
        rbMenuItem.setSelected(true);
        rbMenuItem.setMnemonic(KeyEvent.VK_R);
        group.add(rbMenuItem);
        menu.add(rbMenuItem);

        rbMenuItem = new JRadioButtonMenuItem("Another one");
        rbMenuItem.setMnemonic(KeyEvent.VK_O);
        group.add(rbMenuItem);
        menu.add(rbMenuItem);

        //a group of check box menu items
        menu.addSeparator();
        cbMenuItem = new JCheckBoxMenuItem("A check box menu item");
        cbMenuItem.setMnemonic(KeyEvent.VK_C);
        menu.add(cbMenuItem);

        cbMenuItem = new JCheckBoxMenuItem("Another one");
        cbMenuItem.setMnemonic(KeyEvent.VK_H);
        menu.add(cbMenuItem);


        menu.addSeparator();
        submenu = new JMenu("A submenu");
        submenu.setMnemonic(KeyEvent.VK_S);

        menuItem = new JMenuItem("An item in the submenu");
        menuItem.setAccelerator(KeyStroke.getKeyStroke(
                KeyEvent.VK_2, ActionEvent.ALT_MASK));
        submenu.add(menuItem);

        menuItem = new JMenuItem("Another item");
        submenu.add(menuItem);
        menu.add(submenu);

        //Build second menu in the menu bar.
        menu = new JMenu("Another Menu");
        menu.setMnemonic(KeyEvent.VK_N);
        menu.getAccessibleContext().setAccessibleDescription(
                "This menu does nothing");
        menuBar.add(menu);

        return menuBar;
    }

    public Container createContentPane() {
        //Create the content-pane-to-be.
        JPanel contentPane = new JPanel(new BorderLayout());
        contentPane.setOpaque(true);

        //Create a scrolled text area.
        output = new JTextArea(5, 30);
        output.setEditable(false);
        scrollPane = new JScrollPane(output);

        //Add the text area to the content pane.
        contentPane.add(scrollPane, BorderLayout.CENTER);

        return contentPane;
    }

    /** Returns an ImageIcon, or null if the path was invalid. */
    protected static ImageIcon createImageIcon(String path) {
        java.net.URL imgURL = MenuLookDemo.class.getResource(path);
        if (imgURL != null) {
            return new ImageIcon(imgURL);
        } else {
            System.err.println("Couldn't find file: " + path);
            return null;
        }
    }

    /**
     * Create the GUI and show it.  For thread safety,
     * this method should be invoked from the
     * event-dispatching thread.
     */
    private static void createAndShowGUI() {
        //Create and set up the window.
        JFrame frame = new JFrame("MenuLookDemo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //Create and set up the content pane.
        MenuLookDemo demo = new MenuLookDemo();
        frame.setJMenuBar(demo.createMenuBar());
        frame.setContentPane(demo.createContentPane());

        //Display the window.
        frame.setSize(450, 260);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        //Schedule a job for the event-dispatching thread:
        //creating and showing this application's GUI.
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
}

Error: (From the above example and it is just like the example above which I got to work) 错误:(从上面的例子开始,就像上面的例子一样)

    Couldn't find file: src\TestMenu\img\stop.jpg

May be that BMP is not supported. 可能是不支持BMP。 If you follow the Java source code from the constructor of ImageIcon you end up at: 如果遵循ImageIcon构造函数中的Java源代码,则最终会得到以下结果:

(java.awt.Toolkit.java)

/**
 * Returns an image which gets pixel data from the specified file, 
 * whose format can be either GIF, JPEG or PNG. 
 * ...
 */
 public abstract Image getImage(String filename);

According to this article , ImageIcon supports GIF, JPEG, or PNG. 根据本文的介绍 ,ImageIcon支持GIF,JPEG或PNG。 Try converting your image to another format using something like GIMP or Paint and see if you get the same results. 尝试使用GIMP或Paint之类的图像将图像转换为另一种格式,看看是否得到相同的结果。

http://docs.oracle.com/javase/7/docs/api/java/awt/Toolkit.html#getImage%28java.lang.String%29 http://docs.oracle.com/javase/7/docs/api/java/awt/Toolkit.html#getImage%28java.lang.String%29

It worked for me, I substituted a jpeg on my c drive and changed the path accordingly. 它对我有用,我在c盘上替换了一个jpeg并相应地更改了路径。 It placed the icon in the upper left corner of the frame. 它将图标放置在框架的左上角。 Try simplifying your path to C:\\filename and see if it works. 尝试简化到C:\\ filename的路径,看看是否可行。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM