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 に答える