【问题标题】:Packaging a program containing images打包包含图像的程序
【发布时间】:2013-05-05 09:49:44
【问题描述】:

我在将包含图像的 java 程序打包成 jar 以转换为可执行文件时遇到大量问题。这些图像已用于程序和按钮的背景。请看下图,它显示了我希望转换为 jar 的程序。

IMAGE

正如您在上面看到的,程序运行正常。我创建了没有自定义背景和不包含图像的自定义按钮的相同程序,我成功地将其打包到 jar 中,随后打包到 .exe 文件中。

关于绘制我的背景,我这样做如下:

public void paintComponent(Graphics g) {
    Image img = new ImageIcon("imgs/Bgnd1.jpg").getImage();
    Dimension size = new Dimension(img.getWidth(null), img.getHeight(null));
    setPreferredSize(size);
    setMinimumSize(size);
    setMaximumSize(size);
    setSize(size);
    setLayout(null);
    g.drawImage(img, 0, 0, null);
} 

关于使用图像创建我的 4 个自定义按钮,我正在执行以下操作:

// Prepare rollover images
ImageIcon F1 = new ImageIcon("imgs/btn_f1_not_selected.jpg");
ImageIcon F1rollOver = new ImageIcon("imgs/btn_f1_selected.jpg");

// Create F1 button
final JButton btnF1 = new JButton(F1);
//btnF1.setOpaque(false);
btnF1.setContentAreaFilled(false);
btnF1.setBorder(null);
btnF1.setBorderPainted(false);
btnF1.setFocusPainted(false);
btnF1.setRolloverIcon(F1rollOver);

我尝试将图像放在 bin 文件夹中,为了创建背景,我更改了上述关于图像声明/获取的方法。

public void paintComponent(Graphics g) {
        String path = "Bgnd11.jpg";
        java.net.URL imgURL = getClass().getResource(path);     
        Image img = new ImageIcon(imgURL).getImage();
        Dimension size = new Dimension(img.getWidth(observer), img.getHeight(observer));
        setPreferredSize(size);
        setMinimumSize(size);
        setMaximumSize(size);
        setSize(size);
        setLayout(null);
        g.drawImage(img, 0, 0, null);
}

我还尝试获取创建按钮所需的图像,如下所示,然后将它们传递给我的按钮,但这不起作用。

String path = "Bgnd11.jpg";
java.net.URL imgURL = getClass().getResource(path);     
Image img = new ImageIcon(imgURL).getImage();

如何定位和加载图片?

【问题讨论】:

  • 你的包层次结构是什么?
  • 仅在 paintComponent 内执行 g.drawImage。并且在没有观察者的情况下调用 getWidth/getHeight,这不是异步的。
  • 如需尽快获得更好的帮助,请发帖SSCCE。但作为一般建议。 setPreferredSize(size); setMinimumSize(size); setMaximumSize(size); setSize(size); setLayout(null); g.drawImage(img, 0, 0, null); 不要从 paintComponent() 方法中调用任何 1st 4。不要将布局设置为null ever & 因为JPanelImageObserver,所以最后一行应该是.. g.drawImage(img, 0, 0, this);
  • “我成功将其打包成 jar,随后打包成 .exe 文件。” 对于部署 Java 桌面应用程序,最好的选择通常是安装该应用程序。使用Java Web Start。 JWS 适用于 Windows、OS X 和 *nix。
  • @1897Blanconeri : 希望this answer 对这个话题有所帮助:-)

标签: java swing jbutton embedded-resource imageicon


【解决方案1】:

在您的第一次尝试中,您从文件系统加载图像,位于当前目录中,该目录是启动javaw 命令的java 的目录。这就是阻止您将图像与应用程序捆绑在一起的原因。显然,您的应用程序的最终用户不会在其当前目录中拥有图像,并且他的当前目录将根据他启动应用程序的方式而改变。

您应该将图像打包在 jar 文件中,从而出现在类路径中,然后像第二次尝试一样使用 ClassLoader 加载它们。

假设它们位于 jar 的文件夹 /resources/images 中,因此对应于包 resources.images

使用getClass().getResource("Bgnd11.jpg"),如javadoc 所示,尝试在getClass() 返回的类所在的包中查找Bgnd11.jpg。因此,如果类在包resources.images 中,它将在我们的示例中起作用。如果不是,你应该使用资源的绝对路径:

URL imgURL = getClass().getResource("/resources/images/Bgnd11.jpg");   

另外,不要弄乱 bin 文件夹。这是 Eclipse 的目标文件夹,进行干净的构建将从该目录中删除所有内容。只需将图像添加到源目录中的相应包中,Eclipse 会在构建项目时自动将它们复制到目标目录。

【讨论】:

  • 1+ 还要补充一点:不要从paint(...)paintComponent(...) 方法中读取图像,因为这些方法需要非常快,并且需要只关注绘图而不是文件或资源输入/输出。
  • 同意气垫船。也不应该设置组件的大小,当然也不应该通过 paintComponent() 方法。相反,应该重写 getXxxSize() 以返回图像大小,以便布局管理器正确布局此组件。
  • @Hovercraft & JB:作为参考,Andrew Thompson 一直在更新embedded-resource 标签info;欢迎批评评论。
  • @JBNizet .. 我尝试了上面的建议,即使用资源的绝对路径,但我没有成功,因为创建后 jar 仍然没有运行一次.. 我也停止将图像放在bin 文件夹.. 并从源目录中的图像文件夹中引用它们但没有成功.. 关于为什么我的图像在我运行 jar 文件时不会显示的任何想法?谢谢
  • 编辑您的问题并显示您放置图像的位置、您尝试加载它们的方式以及 jar 文件包含的内容。
猜你喜欢
  • 2016-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多