【问题标题】:How to draw images after upgrade from java 7 to java 14从 java 7 升级到 java 14 后如何绘制图像
【发布时间】:2020-07-21 19:21:12
【问题描述】:

所以我在 jdk 7 下编写了一个游戏,它可以像这样导入和绘制图形:
ImageReader.java:

public static BufferedImage button_quit;

public void fetchGraphics() {
   try {
        button_quit = ImageIO.read(new File("rsc/client/gui/button_quit.jpeg"));
    } catch(Exception e) {
        e.printStackTrace();
        System.out.println("Exception thrown in ClientVariables.class while importing overlay graphics.");
    }
}

DrawClient.java:

protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D) g;
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    g.drawImage(ClientVariables.button_quit, ClientVariables.quitButtonX, ClientVariables.quitButtonY, null);
    repaint();
}

问题 - 在 jdk 7 中它工作得很好,但由于我升级到 jdk 14 没有导入单个图形,它只绘制所有硬编码的线条和内容。我如何更改代码才能使其再次工作,我不知道(有关如何在 java 中绘制图像的教程来自多年前,因此也在 jdk 7 或 8 中)

编辑:它是相同的代码,相同的 ide 甚至不是另一个文件夹,其中的东西位于。图形的位置应该是。我之前没有提到的:未加载图形。我反复得到堆栈跟踪和我的错误消息。堆栈跟踪:
javax.imageio.IIOException:无法读取输入文件!
在 java.desktop/javax.imageio.ImageIO.read(ImageIO.java:1308)
在 GUI.ClientVariables.(ClientVariables.java:100)
在 MAIN.CodeEntry.main(CodeEntry.java:70)

我怀疑可能是问题在于较新版本中的代码不希望“rsc/”文件夹与“src/”文件夹位于同一文件夹中,但可能在其他位置。

【问题讨论】:

  • 你的旧代码是错误的。你不应该在绘画方法中调用 repaint() 。我怀疑更改 JDK 会导致 Java 方法停止工作。问题可能是您的 IDE 的设置和图像文件的位置。你做了什么调试?您是否确认已读取图像?您是否验证了 paintComponent() 方法已执行?您是否确认 x/y 值正确?发布正确的minimal reproducible example 来证明问题。
  • 所以,我的旧代码没有错,只是断章取义。但是你说得对,帖子缺少一些信息,请编辑它。由于游戏有大量代码,因此制作 mre 非常复杂。
  • 因为游戏有大量代码。 - minimal reproducible example 与您的应用程序无关。它是代码确实证明了一个问题。您的问题是读取图像。因此,您只需要一个带有 JLabel 的 JFrame,然后读取图像并创建一个 ImageIcon 以添加到 JLabel。整个课程大约有 20 行代码。关键是您需要学习如何阅读图像。如果图像位于同一位置并且您的 IDE 设置正确,那么它应该会找到该图像。也许问题出在类路径上?
  • 阅读 Loading Images Using getResource 上的 Swing 教程中的部分,以更好地阅读图像。

标签: java file graphics javax.imageio


【解决方案1】:

好吧,我自己解决了,可能是 IDE 搞砸了。基本上,在旧程序中,rsc/ 文件夹与包含此应用程序包的 src/ 文件夹位于同一文件夹中。现在程序搜索上面一个文件夹的 rsc/ 文件夹。为什么?没有线索。不过已经解决了。

【讨论】:

  • 这不是 IDE 搞砸了。基本上,您的(旧)代码是在假设它正在查找的文件位于文件系统中的特定位置相对于您运行应用程序的目录的情况下编写的。这不是一个可移植的假设。一个更好的想法是将资源放在(运行时)资源路径上并从那里加载它。特别是如果图像打算成为您的应用程序的一部分;例如按钮的图像。
猜你喜欢
  • 2012-11-28
  • 2015-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多