【问题标题】:Java - File writing/reading works on Windows but not MacJava - 文件写入/读取适用于 Windows 但不适用于 Mac
【发布时间】:2021-08-07 03:09:11
【问题描述】:

我目前正在开发一个希望在 Windows 和其他操作系统上运行的应用程序。

我遇到了一个问题,从我的程序中的文件夹调用的文件没有出现在 macOS 上,而是出现在 Windows 上。

我所有文件的写入和读取方式与此示例 GUI 代码相同:

public class GUI extends JFrame {
    private JLabel imageLabel;
    
    public GUI()  {
        this.setTitle("test");
        this.setSize(500,349);
        this.setVisible(true);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        
        imageLabel = new JLabel(new ImageIcon("assets/test.png"));
        
        this.getContentPane().setBackground(new Color(20,50,250));

        this.getContentPane().add(imageLabel);
        
        this.setSize(500, 350);
        
    }
}

在 Windows 上,GUI 程序如下所示:

在 MacOS 上,GUI 程序如下所示:

我想补充一点,这些是通过从 Eclipse IDE 导出的 Runnable Jar 文件在操作系统上运行的。正在使用的版本是 JavaSE-1.8。

【问题讨论】:

  • 我没有回答您的问题,但 JavaSE-1.8 是 Java 的最新版本,直到版本 9、10、11、12、13、14、15 和 16 出现:)
  • 理论上,无论操作系统如何,您的应用程序的行为都应该相同。我怀疑问题是文件读取毕竟显示了窗口 - 还是您看到一些异常弹出?你实际上是如何运行你的 GUI 的?但是我缺少的是(我可能错了):您没有定义任何布局管理器。是 Windows 提供了合适的默认值,而 MacOS 上没有?
  • 你能检查文件系统中“assets”和“test.png”的名称吗?你用的是同一种情况吗?
  • 是的,我对所有图像都使用相同的大小写。
  • 您的资产目录是否在以下路径中:src/main/resources?如果是,请尝试 new ImageIcon("/assets/test.png")

标签: java io operating-system


【解决方案1】:

问题出在这里:

imageLabel = new JLabel(new ImageIcon("assets/test.png"));

我的解决方案:

imageLabel = new JLabel(new ImageIcon(getClass().getClassLoader().getResource("test.png")));

说明:

我的初衷是以某种方式合并程序本身的资源,以便与 JAR 可执行文件一起工作。在我的测试中(我是制作可执行文件的新手),我发现除非我有一个单独的文件夹“资产”,用户也可以使用 jar 文件下载它,否则什么都不会起作用。虽然这个解决方案确实奏效了一点,但在某些机器上的一些读写似乎有所不同。

为了使其正常工作,必须将“assets”文件夹或其中包含您的图像的任何文件夹添加到您的 Java 构建路径。

从这里开始,它适用于所有经过测试的机器; Windows 和 MacOS。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-08
    • 2015-03-09
    • 1970-01-01
    • 1970-01-01
    • 2018-04-08
    • 2016-11-07
    • 1970-01-01
    相关资源
    最近更新 更多