【问题标题】:image source path exception in java programjava程序中的图像源路径异常
【发布时间】:2018-06-15 02:05:38
【问题描述】:

我正在关注this 使用 Eclipse 的教程。我收到图像路径的异常。我在程序src 目录中创建了一个文件夹images 并将图像放入其中。我还尝试将图像直接放入src 文件夹。但同样的结果。

这是异常的程序和堆栈跟踪。

欺骗:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at javax.swing.ImageIcon.<init>(Unknown Source)
    at Puzzle.initUI(Puzzle.java:47)
    at Puzzle.<init>(Puzzle.java:31)
    at Puzzle$1.run(Puzzle.java:141)
    at java.awt.event.InvocationEvent.dispatch(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$000(Unknown Source)
    at java.awt.EventQueue$1.run(Unknown Source)
    at java.awt.EventQueue$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)

Java 程序:

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.CropImageFilter;
import java.awt.image.FilteredImageSource;

import javax.swing.Box;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class Puzzle extends JFrame implements ActionListener {

    private JPanel centerPanel;
    private JButton button;
    private JLabel label;
    private Image source;
    private Image image;
    int[][] pos;
    int width, height;

    public Puzzle() {

        initUI();
    }

    public final void initUI() {

        pos = new int[][]{
                    {0, 1, 2},
                    {3, 4, 5},
                    {6, 7, 8},
                    {9, 10, 11}
                };


        centerPanel = new JPanel();
        centerPanel.setLayout(new GridLayout(4, 4, 0, 0));

        ImageIcon sid = new ImageIcon(Puzzle.class.getResource("/images/mickey.jpg"));
        source = sid.getImage();

        width = sid.getIconWidth();
        height = sid.getIconHeight();


        add(Box.createRigidArea(new Dimension(0, 5)), BorderLayout.NORTH);
        add(centerPanel, BorderLayout.CENTER);


        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 3; j++) {
                if (j == 2 && i == 3) {
                    label = new JLabel("");
                    centerPanel.add(label);
                } else {
                    button = new JButton();
                    button.addActionListener(this);
                    centerPanel.add(button);
                    image = createImage(new FilteredImageSource(source.getSource(),
                            new CropImageFilter(j * width / 3, i * height / 4,
                            (width / 3) + 1, height / 4)));
                    button.setIcon(new ImageIcon(image));
                }
            }
        }

        setSize(325, 275);
        setTitle("Puzzle");
        setResizable(false);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    }

    public void actionPerformed(ActionEvent e) {

        JButton button = (JButton) e.getSource();
        Dimension size = button.getSize();

        int labelX = label.getX();
        int labelY = label.getY();
        int buttonX = button.getX();
        int buttonY = button.getY();
        int buttonPosX = buttonX / size.width;
        int buttonPosY = buttonY / size.height;
        int buttonIndex = pos[buttonPosY][buttonPosX];



        if (labelX == buttonX && (labelY - buttonY) == size.height) {

            int labelIndex = buttonIndex + 3;

            centerPanel.remove(buttonIndex);
            centerPanel.add(label, buttonIndex);
            centerPanel.add(button, labelIndex);
            centerPanel.validate();
        }

        if (labelX == buttonX && (labelY - buttonY) == -size.height) {

            int labelIndex = buttonIndex - 3;
            centerPanel.remove(labelIndex);
            centerPanel.add(button, labelIndex);
            centerPanel.add(label, buttonIndex);
            centerPanel.validate();
        }

        if (labelY == buttonY && (labelX - buttonX) == size.width) {

            int labelIndex = buttonIndex + 1;

            centerPanel.remove(buttonIndex);
            centerPanel.add(label, buttonIndex);
            centerPanel.add(button, labelIndex);
            centerPanel.validate();
        }

        if (labelY == buttonY && (labelX - buttonX) == -size.width) {

            int labelIndex = buttonIndex - 1;

            centerPanel.remove(buttonIndex);
            centerPanel.add(label, labelIndex);
            centerPanel.add(button, labelIndex);
            centerPanel.validate();
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            public void run() {
                Puzzle puzzle = new Puzzle();
                puzzle.setVisible(true);
            }
        });
    }
}

目录结构:

swingExamples (it's java project)
 --src
 --bin
 --images
 --.settings 

【问题讨论】:

    标签: java eclipse


    【解决方案1】:

    您需要构建程序的类路径中的图像文件,而不是源文件夹中的图像文件。这意味着无论您的 Puzzle.class 文件被编译到何处,您都需要一个带有 jpeg 的图像文件夹,位于类路径的根目录中。如果您提供程序的目录结构,我可以为您提供更多帮助。

    【讨论】:

    • 我把目录结构放在OP的末尾
    • 在这种情况下,您可能希望将您的 Images 文件夹放入我相信的 bin 文件夹中。
    • 好的,谢谢您的帮助。这个帖子帮我解决了问题:stackoverflow.com/questions/5657469/…
    【解决方案2】:

    要加载您的图像,您可以在您的 src 项目或您正在处理的项目中创建一个新包并将其命名为图像,然后将您的图像直接拖放到您的图像项目资源管理器中IDE。完成此操作后,您可以在图像项目下方看到项目资源管理器中包含的图像。 然后现在您需要转到您的 getResource 方法和参数类型(例如):

    .......getResource(""/images/lion.png"));

    这对我有用。

    【讨论】:

      猜你喜欢
      • 2017-09-14
      • 1970-01-01
      • 2015-11-09
      • 1970-01-01
      • 2015-02-16
      • 2017-09-12
      • 2010-11-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多