2015-03-30 71 views
2

我创建了一个应用程序,并且我为ObservableList创建了模型我想调用集合.contains()这个方法需要equals(),但这总是返回false。我只在equals方法中放入一个字段。当我在if语句中比较使用getter方法时,它会像我期望的那样返回true。JavaFx模型等于总是返回false

import java.util.Objects; 
import javafx.beans.InvalidationListener; 
import javafx.beans.property.SimpleStringProperty; 
import javafx.beans.value.ChangeListener; 
import javafx.beans.value.ObservableValue; 
import javafx.collections.FXCollections; 
import javafx.collections.ObservableList; 
import javafx.scene.image.Image; 

public class Client implements ObservableValue { 

    private final SimpleStringProperty remoteAddress; 
    private final SimpleStringProperty userName; 
    private final boolean connected = true; 
    private final ObservableList<String> logs 
      = FXCollections.observableArrayList(); 
    private final ObservableList<Image> imageLogs 
      = FXCollections.observableArrayList(); 

    public Client(String remoteAddress, String userName) { 
     this.remoteAddress = new SimpleStringProperty(remoteAddress); 
     this.userName = new SimpleStringProperty(userName); 
    } 

    public SimpleStringProperty remoteAddressProperty() { 
     return remoteAddress; 
    } 

    public SimpleStringProperty userNameProperty() { 
     return userName; 
    } 

    public final String getRemoteAddress() { 
     return remoteAddress.get(); 
    } 

    public final void setRemoteAddress(String name) { 
     this.remoteAddress.set(name); 
    } 

    public final String getUserName() { 
     return userName.get(); 
    } 

    public final void setUserName(String name) { 
     this.userName.set(name); 
    } 

    public ObservableList<String> getLogs() { 
     return logs; 
    } 

    public ObservableList<Image> getImageLogs() { 
     return imageLogs; 
    } 

    @Override 
    public boolean equals(Object obj) { 
     if (obj == null || getClass() != obj.getClass()) { 
      return false; 
     } 
     return this.remoteAddress == ((Client) obj).remoteAddress; 
    } 

    @Override 
    public int hashCode() { 
     int hash = 3; 
     hash = 37 * hash + Objects.hashCode(this.remoteAddress); 
     return hash; 
    } 
} 

回答

2

你需要的属性的实际字符串内容比较:

@Override 
public boolean equals(Object obj) { 
    if (obj == null || getClass() != obj.getClass()) { 
     return false; 
    } 
    return this.remoteAddress.get().equals(((Client) obj).remoteAddress.get()); 
} 

@Override 
public int hashCode() { 
    int hash = 3; 
    hash = 37 * hash + Objects.hashCode(this.remoteAddress.get()); 
    return hash; 
} 
+0

但为什么我可以从'TableView'中删除数据?我最近通过调用'table.getItems()。remove(row.getItem())'从tableview(包含Person类对象)中删除数据,即使我没有重写equals和hashCode方法。 – UnKnown 2016-11-04 16:00:20

+0

@未知我真的不知道这与这个问题有什么关系。可能您需要发布自己的问题,为您的代码提供适当的上下文。 – 2016-11-04 16:06:52

+0

我在这里发布了新的问题。 http://stackoverflow.com/questions/40427758/how-tableview-and-listviews-remove-works – UnKnown 2016-11-04 16:42:21

-1

我认为,你不能比较两个对象 “==”,使用等于:

return this.remoteAddress.equals(((Client) obj).remoteAddress); 
+0

同样,假设'SimpleStringProperty'重写'equals(...)'。它没有。 – 2015-03-30 18:26:51

+0

@James_D我删除了我的答案(与此相同),因为即使字符串“equal”,equals也返回false。然而根据文档'equals' *被重载。根据文档'SimpleStringProperty'从'ReadOnlyStringProperty'继承'equals',而不是'Object'。 – 2015-03-30 18:53:22

+0

我看到的[Javadoc中的'equals(...)'](http://docs.oracle.com/javase/8/javafx/api/javafx/beans/property/SimpleStringProperty.html)是唯一的地方它是从'Object'继承的。同样,在['ReadOnlyStringProperty'](http://docs.oracle.com/javase/8/javafx/api/javafx/beans/property/ReadOnlyStringProperty.html)我没有看到'equals(...)'方法。 – 2015-03-30 19:01:02