我的图像图标有问题。我知道以前已经有人问过这个问题,但是我想不出解决办法,因为我认为我的问题有所不同。当我使用Eclipse启动应用程序时,所有工作正常。但是,当我将其制成可运行的jar时,它将不会显示图像。
我的ImagesHolder类的一些代码:
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");
而且,如果我将“图片”设置为网址,则无法重置图片图标,例如此处(我有“标签”,但我想更改标签图标)
标签示例:
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)
最佳答案
好吧,总结一下以前给出的答案:
我猜可能的解决方案是使用Dark Knight建议的classloader
。此外,您只需要在设置之前创建一个新的ImageIcon
。
URL MoneyIcon = ImagesHolder.class.getResource("/Money.png");
Labels.MoneyLabel.setIcon(new ImagesIcon(ImagesHolder.MoneyIcon));
因为如果您再次浏览代码,我认为这在一定程度上是行不通的。我的意思是您想设置一个
ImageIcon
,但是您拥有的最后一个对象是一个URL
对象。必须抛出错误应该是有道理的。但是正如Andrew Thompson所说:您可以从该URL构造一个ImageIcon
,如上所示/解释。并且由于您还解释了目录存在问题(从源代码获取结构到编译),因此我想添加一些链接以供进一步阅读:如果仅使用“普通” Java(无构建工具),则此链接可能会有所帮助: Copying data files upon build in Java/Eclipse。它主要是为Eclipse编写的,但是我想大多数其他IDE应该提供类似的选项。
从我当前的项目中,我还建议使用Maven之类的工具。对于较小的项目,可能需要花些时间才能完成,但是这需要大量工作(例如,库处理,图像等资源的处理等)。这些只是对您可能有用的某些部分。如果您对此感兴趣,我猜您会在Web上找到很多有用的资源,因为Maven(或其他工具,例如Ant和Gradle)非常常用。