我做错了什么?Java将图像绘制到JPanel

我做错了什么?Java将图像绘制到JPanel,java,swing,jframe,jpanel,paintcomponent,Java,Swing,Jframe,Jpanel,Paintcomponent,这是作业,所以我不想寻求帮助,但我似乎看不出我做错了什么。代码最终将创建一个以图像为背景的窗口,然后使用文本文件中的信息,在特定点放置其他图像,用户可以放大 目前,我只是想在JFrame中的JPanel上显示一个图像,但我似乎无法让它正常工作。有人能指出我到底在做什么导致图像无法显示吗 地图类的代码: import javax.swing.*; public class Map extends JPanel { static final long serialVersionUID

这是作业,所以我不想寻求帮助,但我似乎看不出我做错了什么。代码最终将创建一个以图像为背景的窗口,然后使用文本文件中的信息,在特定点放置其他图像,用户可以放大

目前,我只是想在JFrame中的JPanel上显示一个图像,但我似乎无法让它正常工作。有人能指出我到底在做什么导致图像无法显示吗

地图类的代码:

import javax.swing.*;

public class Map extends JPanel
{   
    static final long serialVersionUID = 1;

public Map()
{
}

public JPanel createContentPane()
{
    //Creating a base JPanel to place everything on
    JPanel rootGUI = new JPanel();
    //Setting the Layout Manager to null to place everything manually
    rootGUI.setLayout(null);
    rootGUI.setOpaque(true);
    return rootGUI;
}

private static void createAndShowGUI()
{
    JFrame.setDefaultLookAndFeelDecorated(true);
    JFrame frame = new JFrame("Test for image");
    //Create and set up the content pane
    Map demo = new Map();
    frame.setContentPane(demo.createContentPane());
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(500, 500);
    frame.setResizable(false);
    Hospital hDemo = new Hospital();
    frame.add(hDemo);
    frame.setVisible(true);
}

public static void main(String[] Args)
{
    //Schedule a job for the event-dispatching thread
    //Creating and showing this applications GUI
    SwingUtilities.invokeLater(new Runnable()
    {
        public void run()
        {
            createAndShowGUI();
        }
    });
}
}
医院级别的名称和代码:

import javax.swing.*;
import java.io.*;
import java.awt.*;
import java.awt.image.*;
import javax.imageio.*;

public class Hospital extends JPanel
{
static final long serialVersionUID = 2;
public static BufferedImage hospitalImage;

public Hospital()
{
    super();
    try
    {
        hospitalImage = ImageIO.read(new File("src\\hospital.jpg"));
    }
    catch (IOException ex)
    {
        //Not handled
    }
}

@Override
public void paintComponent(Graphics g)
{
    super.paintComponent(g);

    g.drawImage(hospitalImage, 50, 50, this);
    repaint();
}
}

您尚未定义医院面板的大小

更新至:

public Hospital()
{
    super();
    setSize( /* size */ );
    try
    {
        hospitalImage = ImageIO.read(new File("src\\hospital.jpg"));
    }
    catch (IOException ex)
    {
        //Not handled
    }
}
或者在JFrame/ContentPane中使用不同的布局管理器,如Borderlayout

在这种情况下,您可以将医院添加到您的框架中

frame.add(hDemo, BorderLayout.CENTER);

问题出现在您在此处传递的路径中:
hospitalImage=ImageIO.read(新文件(“src\\hospital.jpg”)

简单的解决方案是将图像作为流加载:

InputStream stream = getClass().getResourceAsStream("hospital.jpg");
hospitalImage = ImageIO.read(stream);
stream.close();

有抛出异常吗?编辑:好的,在catch块中处理该异常(只需键入:
ex.printStackTrace();
)并告诉我您得到了什么。图像不是空的,文件在源文件夹中。我添加了异常处理程序,但什么都没有出现。绝对不正确<如果调整JFrame的大小,code>JPanel
将拉伸。如果确实要确定JPanel的大小,正确的方法是重写
GetPreferedSize
方法,并返回与图像的
Dimension
匹配的
Dimension
。不,只有在将layoutmanager设置为不同于“null”的情况下才会发生这种情况,但是在上面的代码中,layoutmanager设置为“null”(取决于不同的管理者)同样不正确。我刚刚测试了他的代码。问题当然在于他通过的路径。空布局管理器与此无关(除非您开始在
JPanel
上添加swing组件)。尽管如此,我同意他应该严格避免空布局。