2015-03-30 4 views
2

Я создаю приложение, и я создаю модель для ObservableList Я хочу вызвать коллекцию .contains() метод, который является requre equals(), но это всегда возвращает с ложным. Я только поместил одно поле в метод equals. Когда я сравниваю, если выражение использует метод 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'? Я недавно удалил данные из tableview (которые содержат объекты класса Person), вызывая 'table.getItems(). Remove (row.getItem())' даже я не переопределял методы equals и hashCode. – UnKnown

+0

@UnKnown Я действительно не вижу, как это связано с этим вопросом. Возможно, вам нужно опубликовать свой собственный вопрос, указав правильный контекст для вашего кода. –

+0

Я разместил здесь новый вопрос. http://stackoverflow.com/questions/40427758/how-tableview-and-listviews-remove-works – UnKnown

-1

Я думаю, вы не можете сравнить два объекта с "==", использование равно:

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

Опять же, предполагается, что 'SimpleStringProperty' переопределяет' equals (...) '. Это не так. –

+0

@James_D Я удалил свой ответ (тот же, что и этот), так как 'equals' возвращает' false', даже если строки равны. Однако согласно документу 'equals' * * переопределяется. Согласно документам 'SimpleStringProperty' наследует' equals' от 'ReadOnlyStringProperty', а не от' Object'. –

+0

Единственное место, где я вижу ['equals (...)' в Javadoc] (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 (...) ' метод. –

Смежные вопросы