罐子不会显示图像
Jar won't display Images
我对图像图标有疑问。我知道之前有人问过这个问题,但我不知道如何解决这个问题,因为我认为我的问题是不同的。当我用 Eclipse 启动应用程序时,一切正常。但是当我把它做成可运行的jar时,它不会显示图像。
我的 ImagesHolder 的一些代码 Class :
package Clicker;
import javax.swing.ImageIcon;
public class ImagesHolder {
final public ImageIcon AccessoriesIcon = new ImageIcon("Images/Part_Accessories.png");
final public ImageIcon BodyIcon = new ImageIcon("Images/Part_Body.png");
final public ImageIcon BrakesIcon = new ImageIcon("Images/Part_Brakes.png");
final public ImageIcon CoolingIcon = new ImageIcon("Images/Part_Cooling.png");
final public ImageIcon ElectronicsIcon = new ImageIcon("Images/Part_Electronics.png");
final public ImageIcon EngineIcon = new ImageIcon("Images/Part_Engine.png");
final public ImageIcon ExaustIcon = new ImageIcon("Images/Part_Exaust.png");
final public ImageIcon FuelIcon = new ImageIcon("Images/Part_Fuel.png");
final public ImageIcon InteriorIcon = new ImageIcon("Images/Part_Interior.png");
final public ImageIcon SteeringIcon = new ImageIcon("Images/Part_Steering.png");
final public ImageIcon SuspensionIcon = new ImageIcon("Images/Part_Suspension.png");
final public ImageIcon TransmissionIcon = new ImageIcon("Images/Part_Transmission.png");
final public ImageIcon TiresIcon = new ImageIcon("Images/Part_Tires.png");
并且如果我将图像制作为 URL,我无法重置图像图标,就像这里一样(我有标签,我想更改标签图标)
标签示例:
public JLabel AccessoriesLVL1Label = new JLabel(ImagesHolder.LockedIcon);
AccessoriesLVL1Label.setHorizontalTextPosition(JLabel.CENTER);
AccessoriesLVL1Label.setVerticalTextPosition(JLabel.BOTTOM);
AccessoriesLVL1Label.setText("<html>Accessories LVL 1<br>" + "Count: " + Part.parts[1]);
并更改:
if(CarMain.main[5] >=1){
jbtnSellAccessoriesLv1.setEnabled(true);
Labels.AccessoriesLVL1Label.setIcon(ImagesHolder.AccessoriesIcon);
}
已编辑:
如果我这样做:
final public ImageIcon MoneyIcon = new ImageIcon("Images/Money.png");
设为:
URL MoneyIcon = ImagesHolder.class.getResource("/Money.png");
这一行出现错误:
Labels.MoneyLabel.setIcon(ImagesHolder.MoneyIcon);
错误:
The method setIcon(Icon) in the type JLabel is not applicable for the arguments (URL)
有一个从 jar 文件获取图像的替代方法:
理想的方法是在项目根目录下有一个资源目录,并将其包含在源代码目录列表中。这将导致那里的所有图像都被复制到 JAR 中。如果你在那里创建一个子目录,resources/image,那么你最终会得到一个包含图像目录的 JAR。您通过类加载器访问这些图像:
classloader.getResourceAsStream("/image/image1.jpg");
或者,
classloader.getResource("/image/image2.jpg");
参考 this link 了解详细示例。
好吧,总结一下之前给出的答案:
我想一个潜在的解决方案是使用 classloader
作为黑暗骑士提议的。此外,您只需要在设置之前创建一个新的 ImageIcon
。
URL MoneyIcon = ImagesHolder.class.getResource("/Money.png");
Labels.MoneyLabel.setIcon(new ImagesIcon(ImagesHolder.MoneyIcon));
因为如果您再次查看您的代码,我想它是行不通的。我的意思是您想设置一个 ImageIcon
,但您最后拥有的是一个 URL
对象。这必须抛出一个错误应该是有道理的。然而正如 Andrew Thompson 已经说过的:您可以从上面的 displayed/explained 中的 URL 构建一个 ImageIcon
。
并且由于您还解释了目录存在问题(从源代码到编译的结构)我想添加一些 links 以供进一步阅读:如果您只使用 'plain' Java(没有构建工具)也许这个 link 可以帮助:Copying data files upon build in Java/Eclipse。它主要是为 Eclipse 编写的,但我想大多数其他 IDE 应该提供类似的选项。
从我目前的项目来看,我还可以推荐使用像 Maven 这样的工具。对于较小的项目,它可能有点过头了,但它需要做很多工作(例如库处理、图像等资源的处理等)。这些只是一些可能对您有用的部分。如果您对此感兴趣,我想您会在网络上找到很多有用的资源,因为 Maven(或其他工具,如 Ant 和 Gradle)非常常用。
我对图像图标有疑问。我知道之前有人问过这个问题,但我不知道如何解决这个问题,因为我认为我的问题是不同的。当我用 Eclipse 启动应用程序时,一切正常。但是当我把它做成可运行的jar时,它不会显示图像。
我的 ImagesHolder 的一些代码 Class :
package Clicker;
import javax.swing.ImageIcon;
public class ImagesHolder {
final public ImageIcon AccessoriesIcon = new ImageIcon("Images/Part_Accessories.png");
final public ImageIcon BodyIcon = new ImageIcon("Images/Part_Body.png");
final public ImageIcon BrakesIcon = new ImageIcon("Images/Part_Brakes.png");
final public ImageIcon CoolingIcon = new ImageIcon("Images/Part_Cooling.png");
final public ImageIcon ElectronicsIcon = new ImageIcon("Images/Part_Electronics.png");
final public ImageIcon EngineIcon = new ImageIcon("Images/Part_Engine.png");
final public ImageIcon ExaustIcon = new ImageIcon("Images/Part_Exaust.png");
final public ImageIcon FuelIcon = new ImageIcon("Images/Part_Fuel.png");
final public ImageIcon InteriorIcon = new ImageIcon("Images/Part_Interior.png");
final public ImageIcon SteeringIcon = new ImageIcon("Images/Part_Steering.png");
final public ImageIcon SuspensionIcon = new ImageIcon("Images/Part_Suspension.png");
final public ImageIcon TransmissionIcon = new ImageIcon("Images/Part_Transmission.png");
final public ImageIcon TiresIcon = new ImageIcon("Images/Part_Tires.png");
并且如果我将图像制作为 URL,我无法重置图像图标,就像这里一样(我有标签,我想更改标签图标)
标签示例:
public JLabel AccessoriesLVL1Label = new JLabel(ImagesHolder.LockedIcon);
AccessoriesLVL1Label.setHorizontalTextPosition(JLabel.CENTER);
AccessoriesLVL1Label.setVerticalTextPosition(JLabel.BOTTOM);
AccessoriesLVL1Label.setText("<html>Accessories LVL 1<br>" + "Count: " + Part.parts[1]);
并更改:
if(CarMain.main[5] >=1){
jbtnSellAccessoriesLv1.setEnabled(true);
Labels.AccessoriesLVL1Label.setIcon(ImagesHolder.AccessoriesIcon);
}
已编辑: 如果我这样做:
final public ImageIcon MoneyIcon = new ImageIcon("Images/Money.png");
设为:
URL MoneyIcon = ImagesHolder.class.getResource("/Money.png");
这一行出现错误:
Labels.MoneyLabel.setIcon(ImagesHolder.MoneyIcon);
错误:
The method setIcon(Icon) in the type JLabel is not applicable for the arguments (URL)
有一个从 jar 文件获取图像的替代方法:
理想的方法是在项目根目录下有一个资源目录,并将其包含在源代码目录列表中。这将导致那里的所有图像都被复制到 JAR 中。如果你在那里创建一个子目录,resources/image,那么你最终会得到一个包含图像目录的 JAR。您通过类加载器访问这些图像:
classloader.getResourceAsStream("/image/image1.jpg");
或者,
classloader.getResource("/image/image2.jpg");
参考 this link 了解详细示例。
好吧,总结一下之前给出的答案:
我想一个潜在的解决方案是使用 classloader
作为黑暗骑士提议的。此外,您只需要在设置之前创建一个新的 ImageIcon
。
URL MoneyIcon = ImagesHolder.class.getResource("/Money.png");
Labels.MoneyLabel.setIcon(new ImagesIcon(ImagesHolder.MoneyIcon));
因为如果您再次查看您的代码,我想它是行不通的。我的意思是您想设置一个 ImageIcon
,但您最后拥有的是一个 URL
对象。这必须抛出一个错误应该是有道理的。然而正如 Andrew Thompson 已经说过的:您可以从上面的 displayed/explained 中的 URL 构建一个 ImageIcon
。
并且由于您还解释了目录存在问题(从源代码到编译的结构)我想添加一些 links 以供进一步阅读:如果您只使用 'plain' Java(没有构建工具)也许这个 link 可以帮助:Copying data files upon build in Java/Eclipse。它主要是为 Eclipse 编写的,但我想大多数其他 IDE 应该提供类似的选项。
从我目前的项目来看,我还可以推荐使用像 Maven 这样的工具。对于较小的项目,它可能有点过头了,但它需要做很多工作(例如库处理、图像等资源的处理等)。这些只是一些可能对您有用的部分。如果您对此感兴趣,我想您会在网络上找到很多有用的资源,因为 Maven(或其他工具,如 Ant 和 Gradle)非常常用。