打包包含图像的程序

Tok*_*123 2 java swing jbutton embedded-resource imageicon

我有大量问题打包我的java程序,其中包含图像到jar转换为可执行文件.图像已用于程序和按钮的背景中.请参阅下图,其中显示了我希望转换为jar的程序.

图片

在此输入图像描述

如您所见,程序运行正常.我创建了相同的程序,没有自定义背景和自定义按钮,不包含图像,我成功将其打包到一个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);
} 
Run Code Online (Sandbox Code Playgroud)

关于使用图像创建我的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);
Run Code Online (Sandbox Code Playgroud)

我尝试将图像放在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);
}
Run Code Online (Sandbox Code Playgroud)

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

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

如何定位和加载图像?

JB *_*zet 6

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

您应该将图像打包在jar文件中,因此存在于类路径中,因此在您第二次尝试时使用ClassLoader加载它们.

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

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

URL imgURL = getClass().getResource("/resources/images/Bgnd11.jpg");   
Run Code Online (Sandbox Code Playgroud)

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

  • 同意气垫船.也不应该设置组件的大小,当然也不能从paintComponent()方法中完成.相反,应该重写getXxxSize()以返回图像大小,以便布局管理器正确布局此组件. (3认同)