1

我正在尝试创建一个类,它将图像设置为其变量并告诉主类它是什么图像,然后主类绘制它。基本上有大量的对象在它们存在时会打印出来。我实现了这一点,ImageIconBufferedImage似乎更适合一次绘制许多图像或移动的图像等,所以我想避免使用ImageIcon. 主类:

package handBasket;

import java.awt.*;
import javax.swing.*;
public class AppStarter  extends JPanel
{
static ImageDisplayerTest idt;
public void paintComponent(Graphics g)
{
    g.drawImage(idt.demoPann, 0, 0, null);
}
public static void main(String[] args)
{        
    JFrame frame = new JFrame();
    frame.setSize(800,600);
    frame.getContentPane().add(new AppStarter());
    frame.setVisible(true);
    frame.setTitle("The Great Graphical Achievement");
    frame.setResizable(false);
    int w = frame.getSize().width;
    int h = frame.getSize().height;
    Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (dim.width-w)/2;
    int y = (dim.height-h)/2;
    frame.setLocation(x,y);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    idt = new ImageDisplayerTest();
    System.out.println(idt.demoPann);
}
}

当图像是ImageIcon. 至于要绘制图像的对象,它会创建一个文件,将文件名读入该文件并尝试将该文件传递给该文件,BufferedImage但这就是我NullPointerException说它无法读取文件的地方。尝试了多个文件和文件类型,没有变化。

package handBasket;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

public class ImageDisplayerTest
{
BufferedImage demoPann;
File loadThis;
public ImageDisplayerTest()
        {
            loadThis = new File("hp_small.jpg");
            try 
            {
            demoPann = ImageIO.read(loadThis); 
            } 
            catch (IOException e) 
            {
            System.out.println("wtf");
            }
        }
}

任何建议和意见表示赞赏。

- - -编辑:

在执行 printStackTrace() 时,我得到以下几行,请注意其中一些无论如何都会显示,所以我不确定 printStackTrace() 应该做什么。

至于文件夹结构,一切都在我的项目文件夹包含的文件夹中的 src/handBasket 文件夹中。

run:
javax.imageio.IIOException: Can't read input file!
    at javax.imageio.ImageIO.read(ImageIO.java:1301)
    at handBasket.ImageDisplayerTest.<init>(ImageDisplayerTest.java:17)
    at handBasket.AppStarter.main(AppStarter.java:31)
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at handBasket.AppStarter.paintComponent(AppStarter.java:12)
    at javax.swing.JComponent.paint(JComponent.java:1054)
    at javax.swing.JComponent.paintChildren(JComponent.java:887)
    at javax.swing.JComponent.paint(JComponent.java:1063)
    at javax.swing.JComponent.paintChildren(JComponent.java:887)
    at javax.swing.JComponent.paint(JComponent.java:1063)
    at javax.swing.JLayeredPane.paint(JLayeredPane.java:585)
    at javax.swing.JComponent.paintChildren(JComponent.java:887)
    at javax.swing.JComponent.paintToOffscreen(JComponent.java:5228)
    at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1482)
    at javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1413)
    at javax.swing.RepaintManager.paint(RepaintManager.java:1206)
    at javax.swing.JComponent.paint(JComponent.java:1040)
    at java.awt.GraphicsCallback$PaintCallback.run(GraphicsCallback.java:39)
    at sun.awt.SunGraphicsCallback.runOneComponent(SunGraphicsCallback.java:78)
    at sun.awt.SunGraphicsCallback.runComponents(SunGraphicsCallback.java:115)
    at java.awt.Container.paint(Container.java:1967)
    at java.awt.Window.paint(Window.java:3877)
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:781)
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:728)
    at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:677)
    at javax.swing.RepaintManager.access$700(RepaintManager.java:59)
    at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1621)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:721)
    at java.awt.EventQueue.access$200(EventQueue.java:103)
    at java.awt.EventQueue$3.run(EventQueue.java:682)
    at java.awt.EventQueue$3.run(EventQueue.java:680)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:691)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)
BUILD SUCCESSFUL (total time: 15 seconds)
4

1 回答 1

0

您需要参考与类路径相关的图像。这通常涉及将其 URI 作为资源获取:

URI imageurl = getClass().getResource("hp_small.jpg").toURI();

因此,对于您上面的测试,类似于:

public ImageDisplayedTest() {
    try {
        URI imageurl = getClass().getResource("hp_small.jpg").toURI();
        loadThis = new File(imageurl);

        demoPann = ImageIO.read(loadThis);
        System.out.println("Success");
    } catch (IOException e) {
        System.out.println(e);
    } catch (URISyntaxException e) {
        System.out.println(e);
    }
}

应该为你工作。

于 2013-02-11T13:51:13.600 回答