【问题标题】:images are not showing up in paint component图像未显示在绘画组件中
【发布时间】:2012-08-08 07:03:21
【问题描述】:

它给了我一个黑屏背景, 但它似乎没有读取图像或绘制它们, 一些帮助将不胜感激,如果你能告诉我信息 关于我的代码,我很难理解一般 r 模糊的答案,谢谢。

import java.awt.*;
import javax.swing.*;
import javax.swing.JComponent.*;

public class Movie extends JApplet {

    private String movName1;
    private String director1;
    private int yearMade1;
    private Image movPic1;
    private String movName2;
    private String director2;
    private int yearMade2;
    private Image movPic2;
    private String movName3;
    private String director3;
    private int yearMade3;
    private Image movPic3;
    private String movName4;
    private String director4;
    private int yearMade4;
    private Image movPic4;

    public void init() {
        MovieDis goo = new MovieDis(movPic1, movPic2, movPic3, movPic4);
        goo.setBounds(0, 0, 750, 500);
        add(goo);
    }
}

class MovieDis extends JComponent {

    private String movName1;
    private String director1;
    private int yearMade1;
    private Image movPic1;
    private String movName2;
    private String director2;
    private int yearMade2;
    private Image movPic2;
    private String movName3;
    private String director3;
    private int yearMade3;
    private Image movPic3;
    private String movName4;
    private String director4;
    private int yearMade4;
    private Image movPic4;

    public MovieDis(Image movPic1, Image movPic2, Image movPic3, Image movPic4) {
        setBackground(Color.black);
        movPic1 = Toolkit.getDefaultToolkit().createImage("Shaw.jpg");
        movPic2 = Toolkit.getDefaultToolkit().createImage("dances.jpg");
        movPic3 = Toolkit.getDefaultToolkit().getImage("Inception.jpg");
        movPic4 = Toolkit.getDefaultToolkit().getImage("Cuckoo.jpg");
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.black);
        g.fillRect(0, 0, 750, 500);
        g.drawImage(movPic1, 35, 35, 200, 200, this);
        g.drawImage(movPic2, 35, 515, 200, 200, this);
        g.drawImage(movPic3, 265, 35, 200, 200, this);
        g.drawImage(movPic4, 35, 515, 200, 200, this);
    }
}

【问题讨论】:

  • 你必须使用JApplet吗?如果您只是在玩测试想法,使用JFrame 会更容易
  • 为什么代码将 4 个空图像引用传递给应该填充它们的构造函数?我见过传递 4 个图像的代码,以及传递代表图像路径的 4 个字符串的代码,但是你的逻辑让我感到困惑。
  • 请查看answerthis answer,了解更多关于在哪里放置图像以及如何在代码中使用它们的信息:-)
  • 请看一下这个Project.zip,我让你知道目录结构和如何访问图像。上面的链接虽然解释得更好。

标签: java image swing paintcomponent japplet


【解决方案1】:

据我所知,您的图像很可能是空的。看到这是 applet 代码并且您没有使用正确的 URL,如果 Toolkit 无法找到图像,它可能会返回一个标记值(宽度和高度 = -1 的图像)。不幸的是,在这种情况下 g.drawImage 不会抛出异常。请检查您的图片是否已正确加载。

【讨论】:

  • 我该怎么做?我的课程文件夹中有 4 张图片
  • 通过使用日志记录,或者如果您不知道如何通过简单地添加类似 "g.setColor(Color.RED); g.drawString(movPic1.getWidth(null)+" /"+movPic1.getWidth(null),30,30);"到你的绘画方法。后者应该将 movPic1 的大小呈现为组件上的红色文本。如果是“-1/-1”,你的问题是图片加载。
  • 我完全不明白,抱歉,我得到的只是小程序上的黑屏
  • 如果图像被嵌入(编译到 Jar 中),您需要单元格 getClass().getResource("/..."),这将返回图像的 URL
【解决方案2】:

这可能不起作用的原因有很多,最明显的是

  • 您无权读取图像(文件系统或 URL)
  • URL 引用错误(因为文件的位置不是您认为的位置)

根据文件的存储位置,您有两种选择。

如果文件与 Jar 一起存储在服务器上。您需要知道文档库参考。

所以在您的 init 方法中,您需要添加

URL base = getDocumentBase();
System.out.println("base = " + base); // testing only
movPic1 = getImage(base, "issue169.jpg");
movPic2 = getImage(base, "issue194.jpg");
movPic3 = getImage(base, "issue248.jpg");
movPic4 = getImage(base, "issue78.jpg");

这假定图像与 HTML 文件位于服务器上的同一目录中。您可以根据需要使用相对路径。

如果文件存储/捆绑在Jar 中(这可能是静态图像的首选方式),您需要使用classloader 来查找它们

try {
    movPic1 = ImageIO.read(getClass().getResource("/testapplet/issue169.jpg"));
    movPic2 = ImageIO.read(getClass().getResource("/testapplet/issue194.jpg"));
    movPic3 = ImageIO.read(getClass().getResource("/testapplet/issue248.jpg"));
    movPic4 = ImageIO.read(getClass().getResource("/testapplet/issue78.jpg"));
} catch (IOException ex) {
    ex.printStackTrace();
}

我使用了这种方法,但在测试时确实遇到了一个小问题。因为我提交的文件(还)是捆绑的,所以小程序查看器试图将它们作为 File 引用加载,它没有权限这样做 - 小程序视图允许您将其设置为不受限制。

这最终导致

PS- 我将小程序布局管理器设置为BorderLayout,而不是使用绝对定位。

【讨论】:

    猜你喜欢
    • 2015-12-02
    • 2012-10-27
    • 2015-02-09
    • 2012-03-21
    • 2013-08-23
    • 1970-01-01
    • 2016-08-31
    • 2012-12-28
    • 2021-01-23
    相关资源
    最近更新 更多