我做错了什么?Java将图像绘制到JPanel
这是作业,所以我不想寻求帮助,但我似乎看不出我做错了什么。代码最终将创建一个以图像为背景的窗口,然后使用文本文件中的信息,在特定点放置其他图像,用户可以放大 目前,我只是想在JFrame中的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
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组件)。尽管如此,我同意他应该严格避免空布局。