Java 如何比较两个图像图标?

Java 如何比较两个图像图标?,java,swing,jlabel,imageicon,Java,Swing,Jlabel,Imageicon,基本上,我用2张图片做一个棋盘游戏,我会不时地改变它, 所以我需要能够检查两个是否有相同的图像图标。 例如,如果两者都使用resources文件夹中的“pirosfigura.png” public String malomcheck() { String pirosicon=lblNewLabel.getIcon().toString(); String pirosfilenev = pirosicon.substring(pirosicon.lastIndexOf("

基本上,我用2张图片做一个棋盘游戏,我会不时地改变它, 所以我需要能够检查两个是否有相同的图像图标。 例如,如果两者都使用resources文件夹中的“pirosfigura.png”

    public String malomcheck() {
    String pirosicon=lblNewLabel.getIcon().toString();
    String pirosfilenev = pirosicon.substring(pirosicon.lastIndexOf("/"  ) + 1);
    String iconfilenev = labelhely_1.getIcon().toString();
    String filenev = iconfilenev.substring(iconfilenev.lastIndexOf("/"  ) + 1);


    if(filenev==pirosfilenev) {
        lblJtkos.setText("piros malom.");
        JOptionPane.showMessageDialog(null, "working");
        return "lefutott";


    }

        return "notworking. very sad.";
    }
顺便说一下,getIcon().toString()的返回值是javax.swing。ImageIcon@cd7e8021
它指的是我猜的内存位置(?),因此每次运行时它都是随机的,对于每个图像,它似乎都不可用。

实现这一点的一种方法是保持您自己的
图像图标到文件的映射,因此,无论何时加载
ImageIcon
都将其作为键存储在
映射中,并将其文件或某个符号名/enum作为值存储。这样,当您想要比较
imIc1
imIc2
时,您可以编写如下内容:

if (map.get(imIc1).equals(map.get(imIc2)) { ... }
或者(如果您有描述性字符串值)

或(如果使用的是枚举值)

对我来说,这太奇怪了,以至于没有方法可以访问Jlabel用于图像的文件路径

这很有道理。
JLabel
显示一个
图标

为什么JLabel应该知道或关心文件路径

您可以自己实现
图标
界面,并为
图标
进行自定义绘制。因此,并非所有图标都有文件路径。仅从文件创建图像图标

文件名的属性属于
ImageIcon

顺便说一下,getIcon().toString()的返回值是javax.swing。ImageIcon@cd7e8021

请看您正在使用的上述代码

您需要从图像创建一个图标,因此文件信息丢失

相反,您应该直接创建ImageIcon:

ImageIcon icon = new ImageIcon( this.getClass().getResource("pirosfigura.png") ); 
celpont.setIcon( icon ); 
System.out.println( celpont.getIcon() );

我相信ImageIcon会将文件名保存为ImageIcon的“描述”。似乎toString()将返回描述。

您在错误的位置处理此问题。你用来显示某物的图像只是显示器的一个人工制品。假设您正在使用一些数据来决定在每个标签中显示哪个图像图标:而是比较该数据。但是,也可以使用
.equals
,而不是
=
,来比较字符串。如果单击它,我会设置标签,“计算机”会设置另一个标签。我只是想比较一下图片,就这样。感谢.equals提示。我怀疑您是否能够可靠地使用
getIcon().toString()
进行比较。您需要图像本身的一些不变量。如果从文件加载
图像
,则可以比较每个图像的文件名。或者,您可以比较图像数据,您可能需要一个
PixelGrabber
,因为我正在使用源文件夹中的两个文件。对我来说,这太奇怪了,以至于没有方法可以访问Jlabel用于图像的文件路径。
if (map.get(imIc1) == NOT_WORKING_ICON ) { ... }
Image piros=new ImageIcon(this.getClass().getResource("pirosfigura.png")).getImage(); 
celpont.setIcon(new ImageIcon(piros)); 
ImageIcon icon = new ImageIcon( this.getClass().getResource("pirosfigura.png") ); 
celpont.setIcon( icon ); 
System.out.println( celpont.getIcon() );