java drawImage doens't工作

时间:2013-11-15 23:35:37

标签: java swing awt

我正在尝试使用java面板显示图像,但这是不行的。代码不会给出任何异常和/或错误,但图像不会加载。 图像确实存在,我也试过.jpg,但这也不行。

package feupcraftproject;
import javax.swing.*;

public class frame_jogo extends JFrame
{
    public panel_jogo panel;
    public frame_jogo() 
    {
        panel = new panel_jogo();
        //setLayout(new GridLayout(1,1,0,0));
        add(panel);   

        }
}

package feupcraftproject;
import javax.swing.*;
import java.awt.*;
import java.awt.image.*;
import javax.imageio.ImageIO;
import java.io.*;
import java.applet.Applet;


public class panel_jogo extends Applet
{
    public BufferedImage  back;
    public panel_jogo()
    {
        try 
        {
            back = ImageIO.read(new File("src/Recursos/mapa_piso1.png"));         
        }
        catch (IOException A)
        {
            JOptionPane.showMessageDialog(null, A.toString());
        }   
       //this.setBackground(Color.BLACK);
    }
    //@Override
    public void paintComponent(Graphics g)
    {
        //super.paintComponents(g);
        g.drawImage(back, 611, 468, this);

    }
}

2 个答案:

答案 0 :(得分:4)

这有点莫名其妙:

 public class panel_jogo extends Applet // ?? Applet ??

Applet是否有paintComponent(...)方法?我不这么认为。

编辑 - 它没有,我看到你评论了@Override - 太糟糕了,因为它会告诉你没有覆盖存在,所以你的paintComponent(...)方法命中注定没什么用处


<强>建议:

  • 让您的绘图面板类扩展JPanel。
  • 请勿注释掉@Override注释。这是有必要的。
  • 确保您的paintComponent(...)方法确实实际上调用了超级方法,这是您已注释掉的内容。
  • 遵循Java命名约定,包括以大写字母开头的类名。
  • 另一个可能的问题是,您似乎正在将图像向右绘制611像素,向下绘制468像素。考虑让您的绘图程序覆盖getPreferredSize(),以便它实际上足够大,以便在其所需位置显示整个图像。
  • 或者更好,将图像放入ImageIcon,将其放入JLabel,并显示使用布局管理器将JLabel放在JPanel的右下角。

看起来你“借用”的代码实际上遵循了我上面的推荐,但由于一些未知的原因改变它以强迫它行为不端,特别是通过扩展Applet。你能解释一下这背后的推理吗?

答案 1 :(得分:0)

public class panel_jogo extends Applet
{
    public BufferedImage  back;
    public panel_jogo()
    {
        try 
        {
            back = ImageIO.read(new File("src/Recursos/mapa_piso1.png"));  

AppletFile类不能“很好地融合”。

  1. 小程序必须由您进行数字签名,并由用户信任(出现提示时)才能访问File
  2. 即使受信任,applet也无法从服务器加载图片,创建的任何File个对象与客户端计算机相关,并且mapa_piso1.png不会(我认为)会在用户PC的硬盘上找到!
  3. Applet 可以<{1}}从其来自的服务器加载图片。

    1. 为什么编写applet代码?如果是由于规格。请老师将其转介给Why CS teachers should stop teaching Java applets
    2. 为什么选择AWT而不是Swing?有关放弃使用AWT组件的许多理由,请参阅Swing extras over AWT上的此答案。如果您需要支持较旧的基于AWT的API,请参阅Mixing Heavyweight and Lightweight Components